From a6488712617028786cf14767bd73fc034acc8134 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 11:09:34 +0300 Subject: [PATCH 01/15] v2 SDK scaffolding --- projects/abel-sdk-v2/README.md | 1 + .../artifacts/AssetLabeling.arc32.json | 264 ++++ projects/abel-sdk-v2/package-lock.json | 513 +++++++ projects/abel-sdk-v2/package.json | 26 + .../abel-sdk-v2/scripts/update-artifacts.sh | 19 + .../src/generated/abel-contract-client.ts | 1332 +++++++++++++++++ projects/abel-sdk-v2/src/index.ts | 0 projects/abel-sdk-v2/tsconfig.json | 14 + .../smart_contracts/__main__.py | 24 +- 9 files changed, 2182 insertions(+), 11 deletions(-) create mode 100644 projects/abel-sdk-v2/README.md create mode 100644 projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json create mode 100644 projects/abel-sdk-v2/package-lock.json create mode 100644 projects/abel-sdk-v2/package.json create mode 100755 projects/abel-sdk-v2/scripts/update-artifacts.sh create mode 100644 projects/abel-sdk-v2/src/generated/abel-contract-client.ts create mode 100644 projects/abel-sdk-v2/src/index.ts create mode 100644 projects/abel-sdk-v2/tsconfig.json diff --git a/projects/abel-sdk-v2/README.md b/projects/abel-sdk-v2/README.md new file mode 100644 index 0000000..33145d7 --- /dev/null +++ b/projects/abel-sdk-v2/README.md @@ -0,0 +1 @@ +# Abel SDK for js-algorand-sdk v2 diff --git a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json new file mode 100644 index 0000000..ba0ceda --- /dev/null +++ b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json @@ -0,0 +1,264 @@ +{ + "hints": { + "change_admin(account)void": { + "call_config": { + "no_op": "CALL" + } + }, + "add_label(string,string)void": { + "call_config": { + "no_op": "CALL" + } + }, + "remove_label(string)void": { + "call_config": { + "no_op": "CALL" + } + }, + "get_label(string)(string,uint64,uint64)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "LabelDescriptor", + "elements": [ + [ + "name", + "string" + ], + [ + "num_assets", + "uint64" + ], + [ + "num_operators", + "uint64" + ] + ] + } + } + }, + "add_operator_to_label(account,string)void": { + "call_config": { + "no_op": "CALL" + } + }, + "remove_operator_from_label(account,string)void": { + "call_config": { + "no_op": "CALL" + } + }, + "get_operator_labels(account)string[]": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + }, + "add_label_to_asset(string,asset)void": { + "call_config": { + "no_op": "CALL" + } + }, + "remove_label_from_asset(string,asset)void": { + "call_config": { + "no_op": "CALL" + } + }, + "get_asset_labels(asset)string[]": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTUKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5IG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTAgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDExIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEyIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTMgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OS05MQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MC05MQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTcKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4LTEwOQogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTQKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTctMTE4CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA5IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMi0xMzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzQKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzktMTQwCiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDIKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0My0xNDQKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MgogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDggLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU3CiAgICAvLyAjIGRlY3Igb3BlcmF0b3IgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gaWYgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBkZWwgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQtMTY3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzEKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzUKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ny0xODgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwLTIxMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjUKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyLTI0MwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQtMjQ2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5CiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAtMjMyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwLTIzMgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgIT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDEKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9wdXQKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9sYWJlbHMoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "state": { + "global": { + "num_byte_slices": 1, + "num_uints": 0 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": { + "admin": { + "type": "bytes", + "key": "admin" + } + }, + "reserved": {} + }, + "local": { + "declared": {}, + "reserved": {} + } + }, + "contract": { + "name": "AssetLabeling", + "methods": [ + { + "name": "change_admin", + "args": [ + { + "type": "account", + "name": "new_admin" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "add_label", + "args": [ + { + "type": "string", + "name": "id" + }, + { + "type": "string", + "name": "name" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "remove_label", + "args": [ + { + "type": "string", + "name": "id" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "get_label", + "args": [ + { + "type": "string", + "name": "id" + } + ], + "readonly": true, + "returns": { + "type": "(string,uint64,uint64)" + } + }, + { + "name": "add_operator_to_label", + "args": [ + { + "type": "account", + "name": "operator" + }, + { + "type": "string", + "name": "label" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "remove_operator_from_label", + "args": [ + { + "type": "account", + "name": "operator" + }, + { + "type": "string", + "name": "label" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "get_operator_labels", + "args": [ + { + "type": "account", + "name": "operator" + } + ], + "readonly": true, + "returns": { + "type": "string[]" + } + }, + { + "name": "add_label_to_asset", + "args": [ + { + "type": "string", + "name": "label" + }, + { + "type": "asset", + "name": "asset" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "remove_label_from_asset", + "args": [ + { + "type": "string", + "name": "label" + }, + { + "type": "asset", + "name": "asset" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "get_asset_labels", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "readonly": true, + "returns": { + "type": "string[]" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "CREATE" + } +} \ No newline at end of file diff --git a/projects/abel-sdk-v2/package-lock.json b/projects/abel-sdk-v2/package-lock.json new file mode 100644 index 0000000..f0a6268 --- /dev/null +++ b/projects/abel-sdk-v2/package-lock.json @@ -0,0 +1,513 @@ +{ + "name": "abel-sdk-v2", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "abel-sdk-v2", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "buffer": "^6.0.3" + }, + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^4.0.9", + "@types/node": "^22.13.17" + }, + "peerDependencies": { + "@algorandfoundation/algokit-utils": "=7.0.2", + "algosdk": "^2.8.0" + } + }, + "node_modules/@algorandfoundation/algokit-client-generator": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-client-generator/-/algokit-client-generator-4.0.9.tgz", + "integrity": "sha512-8s11VVO7+dumRctXUUME2aWpEOjEWZJZEPqMJt9ADIMrPMXw/3O0+Sc1fvLqX7vWIp22oqvuFGkGC7HleBvfEQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "change-case": "^5.4.4", + "commander": "^11.1.0", + "jsonschema": "^1.4.1" + }, + "bin": { + "algokit-client-generator": "bin/cli.mjs", + "algokitgen": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@algorandfoundation/algokit-utils": "^7.0.1 || ^8.0.1", + "algosdk": "^2.9.0 || ^3.0.0" + } + }, + "node_modules/@algorandfoundation/algokit-utils": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-utils/-/algokit-utils-7.0.2.tgz", + "integrity": "sha512-lNsc7OCWYc9uFzXf055obxPr5oLi7Vcofzuk/XQeFWgvLlFHNhh22lcRoa3aS3bI5Qv9VkJU217bRU/L7N0cDQ==", + "peer": true, + "dependencies": { + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "algosdk": ">=2.9.0 <3.0" + } + }, + "node_modules/@types/node": { + "version": "22.13.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz", + "integrity": "sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/algo-msgpack-with-bigint": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", + "integrity": "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/algosdk": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-2.11.0.tgz", + "integrity": "sha512-MJ9xrjBKqG6ItCAR0Z974DG7nvifXsQxlj7HbWkBat4+h/IygwKPEH/v0dQPOYWdTcf5/5lfu+OyEVOsjxvyRQ==", + "peer": true, + "dependencies": { + "algo-msgpack-with-bigint": "^2.1.1", + "buffer": "^6.0.3", + "hi-base32": "^0.5.1", + "js-sha256": "^0.9.0", + "js-sha3": "^0.8.0", + "js-sha512": "^0.8.0", + "json-bigint": "^1.0.0", + "tweetnacl": "^1.0.3", + "vlq": "^2.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hi-base32": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", + "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==", + "peer": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", + "peer": true + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "peer": true + }, + "node_modules/js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "peer": true + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "peer": true, + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/jsonschema": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "peer": true + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/vlq": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", + "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==", + "peer": true + } + }, + "dependencies": { + "@algorandfoundation/algokit-client-generator": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-client-generator/-/algokit-client-generator-4.0.9.tgz", + "integrity": "sha512-8s11VVO7+dumRctXUUME2aWpEOjEWZJZEPqMJt9ADIMrPMXw/3O0+Sc1fvLqX7vWIp22oqvuFGkGC7HleBvfEQ==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "change-case": "^5.4.4", + "commander": "^11.1.0", + "jsonschema": "^1.4.1" + } + }, + "@algorandfoundation/algokit-utils": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-utils/-/algokit-utils-7.0.2.tgz", + "integrity": "sha512-lNsc7OCWYc9uFzXf055obxPr5oLi7Vcofzuk/XQeFWgvLlFHNhh22lcRoa3aS3bI5Qv9VkJU217bRU/L7N0cDQ==", + "peer": true, + "requires": { + "buffer": "^6.0.3" + } + }, + "@types/node": { + "version": "22.13.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz", + "integrity": "sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==", + "dev": true, + "requires": { + "undici-types": "~6.20.0" + } + }, + "algo-msgpack-with-bigint": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", + "integrity": "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==", + "peer": true + }, + "algosdk": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-2.11.0.tgz", + "integrity": "sha512-MJ9xrjBKqG6ItCAR0Z974DG7nvifXsQxlj7HbWkBat4+h/IygwKPEH/v0dQPOYWdTcf5/5lfu+OyEVOsjxvyRQ==", + "peer": true, + "requires": { + "algo-msgpack-with-bigint": "^2.1.1", + "buffer": "^6.0.3", + "hi-base32": "^0.5.1", + "js-sha256": "^0.9.0", + "js-sha3": "^0.8.0", + "js-sha512": "^0.8.0", + "json-bigint": "^1.0.0", + "tweetnacl": "^1.0.3", + "vlq": "^2.0.4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "peer": true + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hi-base32": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", + "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==", + "peer": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", + "peer": true + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "peer": true + }, + "js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "peer": true + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "peer": true, + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "jsonschema": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "peer": true + }, + "undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "vlq": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", + "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==", + "peer": true + } + } +} diff --git a/projects/abel-sdk-v2/package.json b/projects/abel-sdk-v2/package.json new file mode 100644 index 0000000..82455ab --- /dev/null +++ b/projects/abel-sdk-v2/package.json @@ -0,0 +1,26 @@ +{ + "name": "abel-sdk-v2", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "clean": "rm -rf dist/ artifacts/ src/generated/", + "prebuild": "npm run clean && scripts/update-artifacts.sh", + "build": "tsc", + "prepublishOnly": "npm run build", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@algorandfoundation/algokit-client-generator": "^4.0.9", + "@types/node": "^22.13.17" + }, + "peerDependencies": { + "@algorandfoundation/algokit-utils": "=7.0.2", + "algosdk": "^2.8.0" + }, + "dependencies": { + "buffer": "^6.0.3" + } +} diff --git a/projects/abel-sdk-v2/scripts/update-artifacts.sh b/projects/abel-sdk-v2/scripts/update-artifacts.sh new file mode 100755 index 0000000..3f6faf8 --- /dev/null +++ b/projects/abel-sdk-v2/scripts/update-artifacts.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -eo pipefail + +cd "$(realpath "$(dirname "$0")")" + +artifacts_dir=$(realpath ../artifacts) +src_dir=$(realpath ../src) + +cd ../../asset_labeling-contracts + +contract_file=$(realpath smart_contracts/asset_labeling/contract.py) + +set -o xtrace +algokit --no-color compile python "$contract_file" --out-dir="$artifacts_dir" --output-arc32 --no-output-arc56 --no-output-source-map --no-output-teal + +cd - + +npx --yes @algorandfoundation/algokit-client-generator generate -a "$artifacts_dir/AssetLabeling.arc32.json" -o "$src_dir/generated/abel-contract-client.ts" diff --git a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts new file mode 100644 index 0000000..dc786db --- /dev/null +++ b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts @@ -0,0 +1,1332 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { AlgorandClientInterface } from '@algorandfoundation/algokit-utils/types/algorand-client-interface' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTUKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5IG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTAgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDExIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEyIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTMgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OS05MQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MC05MQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTcKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4LTEwOQogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTQKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTctMTE4CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA5IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMi0xMzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzQKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzktMTQwCiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDIKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0My0xNDQKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MgogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDggLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU3CiAgICAvLyAjIGRlY3Igb3BlcmF0b3IgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gaWYgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBkZWwgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQtMTY3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzEKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzUKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ny0xODgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwLTIxMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjUKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyLTI0MwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQtMjQ2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5CiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAtMjMyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwLTIzMgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgIT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDEKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9wdXQKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9sYWJlbHMoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1Ygo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type LabelDescriptor = { + name: string, + numAssets: bigint, + numOperators: bigint +} + + +/** + * Converts the ABI tuple representation of a LabelDescriptor to the struct representation + */ +export function LabelDescriptorFromTuple(abiTuple: [string, bigint, bigint]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.LabelDescriptor, APP_SPEC.structs) as LabelDescriptor +} + +/** + * The argument types for the AssetLabeling contract + */ +export type AssetLabelingArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'change_admin(account)void': { + newAdmin: Uint8Array | string + } + 'add_label(string,string)void': { + id: string + name: string + } + 'remove_label(string)void': { + id: string + } + 'get_label(string)(string,uint64,uint64)': { + id: string + } + 'add_operator_to_label(account,string)void': { + operator: Uint8Array | string + label: string + } + 'remove_operator_from_label(account,string)void': { + operator: Uint8Array | string + label: string + } + 'get_operator_labels(account)string[]': { + operator: Uint8Array | string + } + 'add_label_to_asset(string,asset)void': { + label: string + asset: bigint + } + 'remove_label_from_asset(string,asset)void': { + label: string + asset: bigint + } + 'get_asset_labels(asset)string[]': { + asset: bigint + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'change_admin(account)void': [newAdmin: Uint8Array | string] + 'add_label(string,string)void': [id: string, name: string] + 'remove_label(string)void': [id: string] + 'get_label(string)(string,uint64,uint64)': [id: string] + 'add_operator_to_label(account,string)void': [operator: Uint8Array | string, label: string] + 'remove_operator_from_label(account,string)void': [operator: Uint8Array | string, label: string] + 'get_operator_labels(account)string[]': [operator: Uint8Array | string] + 'add_label_to_asset(string,asset)void': [label: string, asset: bigint] + 'remove_label_from_asset(string,asset)void': [label: string, asset: bigint] + 'get_asset_labels(asset)string[]': [asset: bigint] + } +} + +/** + * The return type for each method + */ +export type AssetLabelingReturns = { + 'change_admin(account)void': void + 'add_label(string,string)void': void + 'remove_label(string)void': void + 'get_label(string)(string,uint64,uint64)': LabelDescriptor + 'add_operator_to_label(account,string)void': void + 'remove_operator_from_label(account,string)void': void + 'get_operator_labels(account)string[]': string[] + 'add_label_to_asset(string,asset)void': void + 'remove_label_from_asset(string,asset)void': void + 'get_asset_labels(asset)string[]': string[] +} + +/** + * Defines the types of available calls and state of the AssetLabeling smart contract. + */ +export type AssetLabelingTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'change_admin(account)void' | 'change_admin', { + argsObj: AssetLabelingArgs['obj']['change_admin(account)void'] + argsTuple: AssetLabelingArgs['tuple']['change_admin(account)void'] + returns: AssetLabelingReturns['change_admin(account)void'] + }> + & Record<'add_label(string,string)void' | 'add_label', { + argsObj: AssetLabelingArgs['obj']['add_label(string,string)void'] + argsTuple: AssetLabelingArgs['tuple']['add_label(string,string)void'] + returns: AssetLabelingReturns['add_label(string,string)void'] + }> + & Record<'remove_label(string)void' | 'remove_label', { + argsObj: AssetLabelingArgs['obj']['remove_label(string)void'] + argsTuple: AssetLabelingArgs['tuple']['remove_label(string)void'] + returns: AssetLabelingReturns['remove_label(string)void'] + }> + & Record<'get_label(string)(string,uint64,uint64)' | 'get_label', { + argsObj: AssetLabelingArgs['obj']['get_label(string)(string,uint64,uint64)'] + argsTuple: AssetLabelingArgs['tuple']['get_label(string)(string,uint64,uint64)'] + returns: AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] + }> + & Record<'add_operator_to_label(account,string)void' | 'add_operator_to_label', { + argsObj: AssetLabelingArgs['obj']['add_operator_to_label(account,string)void'] + argsTuple: AssetLabelingArgs['tuple']['add_operator_to_label(account,string)void'] + returns: AssetLabelingReturns['add_operator_to_label(account,string)void'] + }> + & Record<'remove_operator_from_label(account,string)void' | 'remove_operator_from_label', { + argsObj: AssetLabelingArgs['obj']['remove_operator_from_label(account,string)void'] + argsTuple: AssetLabelingArgs['tuple']['remove_operator_from_label(account,string)void'] + returns: AssetLabelingReturns['remove_operator_from_label(account,string)void'] + }> + & Record<'get_operator_labels(account)string[]' | 'get_operator_labels', { + argsObj: AssetLabelingArgs['obj']['get_operator_labels(account)string[]'] + argsTuple: AssetLabelingArgs['tuple']['get_operator_labels(account)string[]'] + returns: AssetLabelingReturns['get_operator_labels(account)string[]'] + }> + & Record<'add_label_to_asset(string,asset)void' | 'add_label_to_asset', { + argsObj: AssetLabelingArgs['obj']['add_label_to_asset(string,asset)void'] + argsTuple: AssetLabelingArgs['tuple']['add_label_to_asset(string,asset)void'] + returns: AssetLabelingReturns['add_label_to_asset(string,asset)void'] + }> + & Record<'remove_label_from_asset(string,asset)void' | 'remove_label_from_asset', { + argsObj: AssetLabelingArgs['obj']['remove_label_from_asset(string,asset)void'] + argsTuple: AssetLabelingArgs['tuple']['remove_label_from_asset(string,asset)void'] + returns: AssetLabelingReturns['remove_label_from_asset(string,asset)void'] + }> + & Record<'get_asset_labels(asset)string[]' | 'get_asset_labels', { + argsObj: AssetLabelingArgs['obj']['get_asset_labels(asset)string[]'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_labels(asset)string[]'] + returns: AssetLabelingReturns['get_asset_labels(asset)string[]'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + admin: BinaryState + } + maps: {} + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type AssetLabelingSignatures = keyof AssetLabelingTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AssetLabelingNonVoidMethodSignatures = keyof AssetLabelingTypes['methods'] extends infer T ? T extends keyof AssetLabelingTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AssetLabeling smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AssetLabelingTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AssetLabeling smart contract to the method's return type + */ +export type MethodReturn = AssetLabelingTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = AssetLabelingTypes['state']['global']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AssetLabelingCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AssetLabelingDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AssetLabelingCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AssetLabeling smart contract + */ +export abstract class AssetLabelingParamsFactory { + /** + * Constructs a no op call for the change_admin(account)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static changeAdmin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'change_admin(account)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.newAdmin], + } + } + /** + * Constructs a no op call for the add_label(string,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'add_label(string,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.name], + } + } + /** + * Constructs a no op call for the remove_label(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static removeLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'remove_label(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.id], + } + } + /** + * Constructs a no op call for the get_label(string)(string,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_label(string)(string,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.id], + } + } + /** + * Constructs a no op call for the add_operator_to_label(account,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addOperatorToLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'add_operator_to_label(account,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.operator, params.args.label], + } + } + /** + * Constructs a no op call for the remove_operator_from_label(account,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static removeOperatorFromLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'remove_operator_from_label(account,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.operator, params.args.label], + } + } + /** + * Constructs a no op call for the get_operator_labels(account)string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getOperatorLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_operator_labels(account)string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.operator], + } + } + /** + * Constructs a no op call for the add_label_to_asset(string,asset)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addLabelToAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'add_label_to_asset(string,asset)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.label, params.args.asset], + } + } + /** + * Constructs a no op call for the remove_label_from_asset(string,asset)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static removeLabelFromAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'remove_label_from_asset(string,asset)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.label, params.args.asset], + } + } + /** + * Constructs a no op call for the get_asset_labels(asset)string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_labels(asset)string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AssetLabeling smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AssetLabelingFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AssetLabelingFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClientInterface { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AssetLabelingClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AssetLabelingClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AssetLabeling smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AssetLabelingDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AssetLabelingClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AssetLabelingClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AssetLabeling smart contract + */ +export class AssetLabelingClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AssetLabelingClient` + * + * @param appClient An `AppClient` instance which has been created with the AssetLabeling app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AssetLabelingClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `AssetLabelingClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AssetLabelingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AssetLabelingClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AssetLabelingClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClientInterface { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + changeAdmin: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.changeAdmin(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + addLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.addLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + removeLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.removeLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + addOperatorToLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + removeOperatorFromLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getOperatorLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + addLabelToAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.addLabelToAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + removeLabelFromAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetLabels(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + changeAdmin: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.changeAdmin(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + addLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + removeLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + addOperatorToLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + removeOperatorFromLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getOperatorLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + addLabelToAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addLabelToAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + removeLabelFromAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetLabels(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + changeAdmin: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.changeAdmin(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['change_admin(account)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + addLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.addLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_label(string,string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + removeLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_label(string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_label(string)(string,uint64,uint64)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + addOperatorToLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_operator_to_label(account,string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + removeOperatorFromLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_operator_from_label(account,string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getOperatorLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_operator_labels(account)string[]'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + addLabelToAsset: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.addLabelToAsset(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_label_to_asset(string,asset)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + removeLabelFromAsset: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_label_from_asset(string,asset)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_labels(asset)string[]'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AssetLabelingClient(this.appClient.clone(params)) + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getLabel(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getLabel(params)) + return result.return as unknown as AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getOperatorLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_operator_labels(account)string[]'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_labels(asset)string[]'] + } + + /** + * Methods to access state for the current AssetLabeling app + */ + state = { + /** + * Methods to access global state for the current AssetLabeling app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + admin: new BinaryStateValue(result.admin), + } + }, + /** + * Get the current value of the admin key in global state + */ + admin: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("admin")) as Uint8Array | undefined) }, + }, + } + + public newGroup(): AssetLabelingComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a change_admin(account)void method call against the AssetLabeling contract + */ + changeAdmin(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeAdmin(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a add_label(string,string)void method call against the AssetLabeling contract + */ + addLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a remove_label(string)void method call against the AssetLabeling contract + */ + removeLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_label(string)(string,uint64,uint64) method call against the AssetLabeling contract + */ + getLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getLabel(params))) + resultMappers.push((v) => client.decodeReturnValue('get_label(string)(string,uint64,uint64)', v)) + return this + }, + /** + * Add a add_operator_to_label(account,string)void method call against the AssetLabeling contract + */ + addOperatorToLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addOperatorToLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a remove_operator_from_label(account,string)void method call against the AssetLabeling contract + */ + removeOperatorFromLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeOperatorFromLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_operator_labels(account)string[] method call against the AssetLabeling contract + */ + getOperatorLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getOperatorLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_operator_labels(account)string[]', v)) + return this + }, + /** + * Add a add_label_to_asset(string,asset)void method call against the AssetLabeling contract + */ + addLabelToAsset(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addLabelToAsset(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a remove_label_from_asset(string,asset)void method call against the AssetLabeling contract + */ + removeLabelFromAsset(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeLabelFromAsset(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_labels(asset)string[] method call against the AssetLabeling contract + */ + getAssetLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_labels(asset)string[]', v)) + return this + }, + /** + * Add a clear state call to the AssetLabeling contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as AssetLabelingComposer + } +} +export type AssetLabelingComposer = { + /** + * Calls the change_admin(account)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + changeAdmin(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['change_admin(account)void'] | undefined]> + + /** + * Calls the add_label(string,string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_label(string,string)void'] | undefined]> + + /** + * Calls the remove_label(string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + removeLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_label(string)void'] | undefined]> + + /** + * Calls the get_label(string)(string,uint64,uint64) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] | undefined]> + + /** + * Calls the add_operator_to_label(account,string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addOperatorToLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_operator_to_label(account,string)void'] | undefined]> + + /** + * Calls the remove_operator_from_label(account,string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + removeOperatorFromLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_operator_from_label(account,string)void'] | undefined]> + + /** + * Calls the get_operator_labels(account)string[] ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getOperatorLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_operator_labels(account)string[]'] | undefined]> + + /** + * Calls the add_label_to_asset(string,asset)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addLabelToAsset(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_label_to_asset(string,asset)void'] | undefined]> + + /** + * Calls the remove_label_from_asset(string,asset)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + removeLabelFromAsset(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_label_from_asset(string,asset)void'] | undefined]> + + /** + * Calls the get_asset_labels(asset)string[] ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_labels(asset)string[]'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AssetLabelingComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AssetLabelingComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AssetLabelingComposerResults = Expand + diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/projects/abel-sdk-v2/tsconfig.json b/projects/abel-sdk-v2/tsconfig.json new file mode 100644 index 0000000..8c68693 --- /dev/null +++ b/projects/abel-sdk-v2/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es2016", + "module": "nodenext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "declaration": true, + "outDir": "dist/" + }, + "include": [ + "src/" + ] +} diff --git a/projects/asset_labeling-contracts/smart_contracts/__main__.py b/projects/asset_labeling-contracts/smart_contracts/__main__.py index d45c561..23026d0 100644 --- a/projects/asset_labeling-contracts/smart_contracts/__main__.py +++ b/projects/asset_labeling-contracts/smart_contracts/__main__.py @@ -91,18 +91,20 @@ def build(output_dir: Path, contract_path: Path) -> Path: output_dir.mkdir(exist_ok=True, parents=True) logger.info(f"Exporting {contract_path} to {output_dir}") + cmd_list = [ + "algokit", + "--no-color", + "compile", + "python", + str(contract_path.resolve()), + f"--out-dir={output_dir}", + "--no-output-arc32", + "--output-arc56", + "--output-source-map", + ] + logger.debug(f"Running {" ".join(cmd_list)}") build_result = subprocess.run( - [ - "algokit", - "--no-color", - "compile", - "python", - str(contract_path.resolve()), - f"--out-dir={output_dir}", - "--no-output-arc32", - "--output-arc56", - "--output-source-map", - ], + cmd_list, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, From d1c85de905c6d48dd9925cf794cd5571e6d19ba3 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 14:31:57 +0300 Subject: [PATCH 02/15] v2 SDK semi working --- .../artifacts/AssetLabeling.arc32.json | 21 +- projects/abel-sdk-v2/cli/.appid | 1 + projects/abel-sdk-v2/cli/create.ts | 80 + projects/abel-sdk-v2/package-lock.json | 758 ++++- projects/abel-sdk-v2/package.json | 10 +- .../src/generated/abel-contract-client.ts | 92 +- projects/abel-sdk-v2/src/index.ts | 231 ++ projects/abel-sdk-v2/src/types.ts | 8 + projects/abel-sdk-v2/src/util.ts | 16 + .../AssetLabeling.approval.puya.map | 2601 ++++++++++------- .../AssetLabeling.approval.teal | 351 ++- .../asset_labeling/AssetLabeling.arc56.json | 112 +- .../asset_labeling/AssetLabelingClient.ts | 92 +- .../asset_labeling/contract.py | 5 + 14 files changed, 3116 insertions(+), 1262 deletions(-) create mode 100644 projects/abel-sdk-v2/cli/.appid create mode 100644 projects/abel-sdk-v2/cli/create.ts create mode 100644 projects/abel-sdk-v2/src/types.ts create mode 100644 projects/abel-sdk-v2/src/util.ts diff --git a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json index ba0ceda..885b5e8 100644 --- a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json +++ b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json @@ -40,6 +40,12 @@ } } }, + "log_labels(string[])void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + }, "add_operator_to_label(account,string)void": { "call_config": { "no_op": "CALL" @@ -74,7 +80,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTUKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5IG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTAgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDExIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEyIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTMgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OS05MQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MC05MQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTcKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4LTEwOQogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTQKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTctMTE4CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA5IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMi0xMzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzQKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzktMTQwCiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDIKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0My0xNDQKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MgogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDggLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU3CiAgICAvLyAjIGRlY3Igb3BlcmF0b3IgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gaWYgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBkZWwgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQtMTY3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzEKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzUKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ny0xODgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwLTIxMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjUKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyLTI0MwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQtMjQ2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5CiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAtMjMyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwLTIzMgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgIT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDEKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9wdXQKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9sYWJlbHMoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -161,6 +167,19 @@ "type": "(string,uint64,uint64)" } }, + { + "name": "log_labels", + "args": [ + { + "type": "string[]", + "name": "ids" + } + ], + "readonly": true, + "returns": { + "type": "void" + } + }, { "name": "add_operator_to_label", "args": [ diff --git a/projects/abel-sdk-v2/cli/.appid b/projects/abel-sdk-v2/cli/.appid new file mode 100644 index 0000000..70ea5f5 --- /dev/null +++ b/projects/abel-sdk-v2/cli/.appid @@ -0,0 +1 @@ +4776 \ No newline at end of file diff --git a/projects/abel-sdk-v2/cli/create.ts b/projects/abel-sdk-v2/cli/create.ts new file mode 100644 index 0000000..8fc8ac1 --- /dev/null +++ b/projects/abel-sdk-v2/cli/create.ts @@ -0,0 +1,80 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +const LABEL_ID = process.env.LABEL_ID ?? "pv"; +const LABEL_NAME = process.env.LABEL_NAME ?? "Pera Verified"; +const ASSET_ID = 1002n + +Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ ignoreCache: true, onUpdate: "append", onSchemaBreak: "append" }); + +// If app was just created fund the app account +if (['create', 'replace'].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }) +} + +const { appId } = appClient; + +writeFileSync(".appid", String(appId)); +console.log("Wrote", ".appid", appId); + +const operator = deployer.addr; + +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer }); + +const existingLabels = await sdk.getLabelDescriptors(['pv']) +console.log({existingLabels}) + +if (!existingLabels.has(LABEL_ID)) { + await sdk.addLabel(LABEL_ID, LABEL_NAME); +} + +let operatorLabels: string[] = [] +try { + operatorLabels = await sdk.getOperatorLabels(operator) +} catch(e) { + if (e.message !== "ERR:NOEXIST") { + throw e + } +} + +if (!operatorLabels.includes(LABEL_ID)) { + console.log("adding operator to label") + await sdk.addOperatorToLabel(operator, LABEL_ID) +} + +operatorLabels = await sdk.getOperatorLabels(operator) + +console.log({operatorLabels}); + +if (!(await sdk.getAssetLabels(ASSET_ID)).includes(LABEL_ID)) { + console.log("add label to asset") + await sdk.addLabelToAsset(ASSET_ID, LABEL_ID); +} + +const assetLabels = await sdk.getAssetLabels(ASSET_ID) +console.log({assetLabels}); + +console.log(await sdk.getLabelDescriptors(['pv'])) +console.log("removing label from asset") +await sdk.removeLabelFromAsset(ASSET_ID, LABEL_ID) + +console.log(await sdk.getLabelDescriptors(['pv'])) + +console.log("removing operator from label") +await sdk.removeOperatorFromLabel(operator, LABEL_ID) + diff --git a/projects/abel-sdk-v2/package-lock.json b/projects/abel-sdk-v2/package-lock.json index f0a6268..278739c 100644 --- a/projects/abel-sdk-v2/package-lock.json +++ b/projects/abel-sdk-v2/package-lock.json @@ -8,16 +8,15 @@ "name": "abel-sdk-v2", "version": "1.0.0", "license": "ISC", - "dependencies": { - "buffer": "^6.0.3" - }, "devDependencies": { "@algorandfoundation/algokit-client-generator": "^4.0.9", - "@types/node": "^22.13.17" + "@types/node": "^22.13.17", + "tsx": "^4.19.3" }, "peerDependencies": { "@algorandfoundation/algokit-utils": "=7.0.2", - "algosdk": "^2.8.0" + "algosdk": "^2.8.0", + "buffer": "^6.0.3" } }, "node_modules/@algorandfoundation/algokit-client-generator": { @@ -58,6 +57,406 @@ "algosdk": ">=2.9.0 <3.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@types/node": { "version": "22.13.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz", @@ -128,7 +527,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/bignumber.js": { "version": "9.1.2", @@ -157,6 +557,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -211,6 +612,72 @@ "node": ">=16" } }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -243,7 +710,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/js-sha256": { "version": "0.9.0", @@ -281,6 +749,15 @@ "node": "*" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -293,6 +770,25 @@ "node": ">=8" } }, + "node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -334,6 +830,181 @@ "buffer": "^6.0.3" } }, + "@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "dev": true, + "optional": true + }, "@types/node": { "version": "22.13.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz", @@ -378,7 +1049,8 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "peer": true }, "bignumber.js": { "version": "9.1.2", @@ -390,6 +1062,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "peer": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -432,6 +1105,55 @@ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, + "esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -447,7 +1169,8 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "peer": true }, "js-sha256": { "version": "0.9.0", @@ -482,6 +1205,12 @@ "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", "dev": true }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -491,6 +1220,17 @@ "has-flag": "^4.0.0" } }, + "tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, + "requires": { + "esbuild": "~0.25.0", + "fsevents": "~2.3.3", + "get-tsconfig": "^4.7.5" + } + }, "tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", diff --git a/projects/abel-sdk-v2/package.json b/projects/abel-sdk-v2/package.json index 82455ab..2d5d5e2 100644 --- a/projects/abel-sdk-v2/package.json +++ b/projects/abel-sdk-v2/package.json @@ -14,13 +14,13 @@ "license": "ISC", "devDependencies": { "@algorandfoundation/algokit-client-generator": "^4.0.9", - "@types/node": "^22.13.17" + "@types/node": "^22.13.17", + "tsx": "^4.19.3" }, "peerDependencies": { "@algorandfoundation/algokit-utils": "=7.0.2", - "algosdk": "^2.8.0" - }, - "dependencies": { + "algosdk": "^2.8.0", "buffer": "^6.0.3" - } + }, + "type": "module" } diff --git a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts index dc786db..8a4921f 100644 --- a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts +++ b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTUKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5IG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTAgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDExIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEyIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTMgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OS05MQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MC05MQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTcKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4LTEwOQogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTQKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTctMTE4CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA5IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMi0xMzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzQKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzktMTQwCiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDIKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0My0xNDQKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MgogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDggLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU3CiAgICAvLyAjIGRlY3Igb3BlcmF0b3IgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gaWYgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBkZWwgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQtMTY3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzEKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzUKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ny0xODgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwLTIxMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjUKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyLTI0MwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQtMjQ2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5CiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAtMjMyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwLTIzMgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgIT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDEKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9wdXQKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9sYWJlbHMoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1Ygo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract /** * A state record containing binary data @@ -100,6 +100,9 @@ export type AssetLabelingArgs = { 'get_label(string)(string,uint64,uint64)': { id: string } + 'log_labels(string[])void': { + ids: string[] + } 'add_operator_to_label(account,string)void': { operator: Uint8Array | string label: string @@ -131,6 +134,7 @@ export type AssetLabelingArgs = { 'add_label(string,string)void': [id: string, name: string] 'remove_label(string)void': [id: string] 'get_label(string)(string,uint64,uint64)': [id: string] + 'log_labels(string[])void': [ids: string[]] 'add_operator_to_label(account,string)void': [operator: Uint8Array | string, label: string] 'remove_operator_from_label(account,string)void': [operator: Uint8Array | string, label: string] 'get_operator_labels(account)string[]': [operator: Uint8Array | string] @@ -148,6 +152,7 @@ export type AssetLabelingReturns = { 'add_label(string,string)void': void 'remove_label(string)void': void 'get_label(string)(string,uint64,uint64)': LabelDescriptor + 'log_labels(string[])void': void 'add_operator_to_label(account,string)void': void 'remove_operator_from_label(account,string)void': void 'get_operator_labels(account)string[]': string[] @@ -184,6 +189,11 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_label(string)(string,uint64,uint64)'] returns: AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] }> + & Record<'log_labels(string[])void' | 'log_labels', { + argsObj: AssetLabelingArgs['obj']['log_labels(string[])void'] + argsTuple: AssetLabelingArgs['tuple']['log_labels(string[])void'] + returns: AssetLabelingReturns['log_labels(string[])void'] + }> & Record<'add_operator_to_label(account,string)void' | 'add_operator_to_label', { argsObj: AssetLabelingArgs['obj']['add_operator_to_label(account,string)void'] argsTuple: AssetLabelingArgs['tuple']['add_operator_to_label(account,string)void'] @@ -332,6 +342,19 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.id], } } + /** + * Constructs a no op call for the log_labels(string[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static logLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'log_labels(string[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.ids], + } + } /** * Constructs a no op call for the add_operator_to_label(account,string)void ABI method * @@ -692,6 +715,18 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getLabel(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.logLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. * @@ -814,6 +849,18 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getLabel(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.logLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. * @@ -940,6 +987,19 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_label(string)(string,uint64,uint64)'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + logLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['log_labels(string[])void'])} + }, + /** * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. * @@ -1035,6 +1095,19 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async logLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) + return result.return as unknown as AssetLabelingReturns['log_labels(string[])void'] + } + /** * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. * @@ -1123,6 +1196,14 @@ export class AssetLabelingClient { resultMappers.push((v) => client.decodeReturnValue('get_label(string)(string,uint64,uint64)', v)) return this }, + /** + * Add a log_labels(string[])void method call against the AssetLabeling contract + */ + logLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logLabels(params))) + resultMappers.push(undefined) + return this + }, /** * Add a add_operator_to_label(account,string)void method call against the AssetLabeling contract */ @@ -1242,6 +1323,15 @@ export type AssetLabelingComposer = { */ getLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] | undefined]> + /** + * Calls the log_labels(string[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + logLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['log_labels(string[])void'] | undefined]> + /** * Calls the add_operator_to_label(account,string)void ABI method. * diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index e69de29..d49fc18 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -0,0 +1,231 @@ +import { TransactionSignerAccount } from "@algorandfoundation/algokit-utils/types/account"; +import { decodeAddress, encodeUint64, makeEmptyTransactionSigner } from "algosdk"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { BoxName } from "@algorandfoundation/algokit-utils/types/app"; +import { + AssetLabelingClient, + AssetLabelingFactory, + LabelDescriptorFromTuple as LabelDescriptorBoxValueFromTuple, +} from "./generated/abel-contract-client.js"; +import { LabelDescriptor } from "./types.js"; +import { wrapErrors } from "./util.js"; + +export * from "./types.js"; +export { AssetLabelingClient, AssetLabelingFactory }; + +const DEFAULT_READ_ACCOUNT = "A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE"; +const SIMULATE_PARAMS = { + allowMoreLogging: true, + allowUnnamedResources: true, + extraOpcodeBudget: 130013, + fixSigners: true, + allowEmptySignatures: true, +}; + +export class AbelSDK { + readClient: AssetLabelingClient; + writeClient: AssetLabelingClient | undefined; + writeAccount?: TransactionSignerAccount | undefined; + + constructor({ + algorand, + appId, + readAccount = DEFAULT_READ_ACCOUNT, + writeAccount, + }: { + algorand: AlgorandClient; + appId: bigint; + writeAccount?: TransactionSignerAccount; + readAccount?: string; + }) { + // Client used for read queries. Sender can be any funded address. + // Default read is the A7N.. fee sink which is funded on all public ALGO networks incl. localnet + this.readClient = algorand.client.getTypedAppClientById(AssetLabelingClient, { + appId, + defaultSender: readAccount, + defaultSigner: makeEmptyTransactionSigner(), + }); + + // tranascting requires a writeAccount + if (writeAccount) { + this.writeClient = algorand.client.getTypedAppClientById(AssetLabelingClient, { + appId, + defaultSender: writeAccount.addr, + defaultSigner: writeAccount.signer, + }); + this.writeAccount = writeAccount; + } + } + + get appId() { + return this.readClient.appId; + } + + private async getBoxesByLength(length: number): Promise { + const boxNames = await this.readClient.algorand.app.getBoxNames(this.appId); + return boxNames.filter((boxName) => boxName.name.length === 2); + } + + /* + * ts guard for write clients only + */ + requireWriteClient(): asserts this is this & { writeAccount: TransactionSignerAccount } & { writeClient: AssetLabelingClient } { + if (this.writeAccount === undefined || this.writeClient === undefined) { + throw new Error(`A transaction operation was issued on a read-only client`); + } + } + + /* + * Readers + * + * We simulate from a client configured with a (theoretically) known-good account on all networks, default dev fee sink + */ + + async getLabelDescriptor(labelId: string): Promise { + const { + returns: [labelDescriptorValue], + } = await wrapErrors( + this.readClient + .newGroup() + .getLabel({ args: { id: labelId }, boxReferences: [labelId] }) + .simulate(SIMULATE_PARAMS) + ); + + return { id: labelId, ...labelDescriptorValue! }; + } + + async getLabelDescriptors(labelIds: string[]): Promise> { + const labels = await this.getBoxesByLength(2); + + const { confirmations } = await wrapErrors( + this.readClient + .newGroup() + .logLabels({ args: { ids: labelIds }, boxReferences: labelIds }) + .simulate(SIMULATE_PARAMS) + ); + + const logs = confirmations[0]!.logs ?? []; + + // find a method that returns the same value as we are logging + const method = this.readClient.appClient.getABIMethod("get_label"); + + const labelDescriptors: Map = new Map(); + + logs.forEach((logValue: Uint8Array, idx) => { + const id = labelIds[idx]; + const descriptorValue = LabelDescriptorBoxValueFromTuple( + // @ts-ignore TODO fixable? + method.returns.type.decode(logs[idx]) + ); + labelDescriptors.set(id, { id, ...descriptorValue }); + }); + + return labelDescriptors; + } + + async getOperatorLabels(operator: string): Promise { + const { + returns: [operatorLabels], + } = await wrapErrors( + this.readClient + .newGroup() + .getOperatorLabels({ args: { operator }, boxReferences: [operator] }) + .simulate(SIMULATE_PARAMS) + ); + + return operatorLabels!; + } + + async getAssetLabels(assetId: bigint): Promise { + const { + returns: [assetLabels], + } = await wrapErrors( + this.readClient + .newGroup() + .getAssetLabels({ args: { asset: assetId }, boxReferences: [encodeUint64(assetId)] }) + .simulate(SIMULATE_PARAMS) + ); + + return assetLabels!; + } + + /* + * Write methods = transactions + */ + + async addLabel(labelId: string, name: string) { + this.requireWriteClient(); + + const query = this.writeClient + .newGroup() + .addTransaction( + await this.writeClient.algorand.createTransaction.payment({ + sender: this.writeAccount.addr, + receiver: this.writeClient.appAddress, + amount: (0.2).algos(), + }), + this.writeAccount.signer + ) + .addLabel({ args: { id: labelId, name }, boxReferences: [labelId] }) + .send(); + + return wrapErrors(query); + } + + async removeLabel(labelId: string) { + this.requireWriteClient(); + const query = this.writeClient.send.removeLabel({ + args: { + id: labelId, + }, + boxReferences: [labelId], + }); + return wrapErrors(query); + } + + async addOperatorToLabel(operator: string, labelId: string) { + this.requireWriteClient(); + const query = this.writeClient.send.addOperatorToLabel({ + args: { + operator, + label: labelId, + }, + boxReferences: [decodeAddress(operator).publicKey, labelId], + }); + + return wrapErrors(query); + } + + async removeOperatorFromLabel(operator: string, labelId: string) { + this.requireWriteClient(); + const query = await this.writeClient.send.removeOperatorFromLabel({ + args: { operator, label: labelId }, + boxReferences: [decodeAddress(operator).publicKey, labelId], + }); + return wrapErrors(query); + } + + async addLabelToAsset(assetId: bigint, labelId: string) { + this.requireWriteClient(); + const query = this.writeClient.send.addLabelToAsset({ + args: { + asset: assetId, + label: labelId, + }, + boxReferences: [labelId, encodeUint64(assetId), decodeAddress(this.writeAccount.addr).publicKey], + }); + return wrapErrors(query); + } + + async removeLabelFromAsset(assetId: bigint, labelId: string) { + this.requireWriteClient(); + const query = this.writeClient.send.removeLabelFromAsset({ + args: { + asset: assetId, + label: labelId, + }, + boxReferences: [labelId, encodeUint64(assetId), decodeAddress(this.writeAccount.addr).publicKey], + }); + return wrapErrors(query); + } +} diff --git a/projects/abel-sdk-v2/src/types.ts b/projects/abel-sdk-v2/src/types.ts new file mode 100644 index 0000000..d015dda --- /dev/null +++ b/projects/abel-sdk-v2/src/types.ts @@ -0,0 +1,8 @@ +import { + LabelDescriptor as LabelDescriptorBoxValue, +} from "./generated/abel-contract-client.js"; + +export interface LabelDescriptor extends LabelDescriptorBoxValue { + id: string; +} + diff --git a/projects/abel-sdk-v2/src/util.ts b/projects/abel-sdk-v2/src/util.ts new file mode 100644 index 0000000..7434517 --- /dev/null +++ b/projects/abel-sdk-v2/src/util.ts @@ -0,0 +1,16 @@ + +export async function wrapErrors(a: T) { + try { + return await a; + } catch (_e) { + // TODO fallback for non-dev-mode nodes: iterate logs and find `ERR:` + const e = _e as Error; + let m: RegExpExecArray | null; + if ((m = /"(ERR:[^"]+)"/.exec(e.message))) { + // @ts-ignore remove? + e.originalMessage = e.message; + e.message = m[1]; + } + throw e; + } +} diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map index 1fca3a6..86ff3cc 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map @@ -3,7 +3,7 @@ "sources": [ "../../asset_labeling/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCQ;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAmNK;;AAAA;AAAA;AAAA;;AAAA;AAnNL;;;AAAA;AAAA;;AAmNK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAjLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAiLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AArJL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAqJK;;;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;AAvIL;;;AAAA;AAAA;;AAuIK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AA9FL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AA8FK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAlEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAkEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAnCL;;;AAAA;;;AAmCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA3BL;;;AAAA;;;AA2BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAhBL;;;AAAA;;;AAAA;;;AAAA;;;AAgBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAXL;;;AAAA;AAAA;;AAWK;;;AAAA;;AAXL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASe;;AAAc;AAAA;AAAA;AAAA;AAAd;AApBR;;;AAoBkC;;AAnBjC;AACA;;AAoBR;;;AAEQ;;;AACA;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9BR;;;AA8B+B;;AA7B9B;AACA;AA6BO;;AAAA;AAAmB;AAAnB;AA/BR;;;AA+B8B;;AA9B7B;AACA;AA+BI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AAzCR;;;AAyC2B;AAxC1B;AACA;AAwCO;;AAAA;AAAmB;AAAnB;AA1CR;;;AA0C8B;;AAzC7B;AACA;AAyCO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AA3CR;;;AA2CyC;;AA1CxC;AACA;AA0CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AAhDR;;;AAgD2B;AA/C1B;AACA;AA+CO;;AAAA;AAAA;AAAP;AAIR;;;AAEW;;AAAc;AAAA;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;AADC;AADJ;;;;AA9DL;;;AAiEK;;AAhEJ;AACA;;;;;;AAkER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AAhFR;;;AAgF8B;AA/E7B;AACA;AAgFG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;AADH;AArFT;;;AAuFS;;AAtFR;AACA;AAyFe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AA7GR;;;AA6G8B;AA5G7B;AACA;AA4GO;;AAAA;AAAA;;AA9GR;;;AA8GoC;AA7GnC;AACA;AA+GA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AAnHL;;;AAsHK;AArHJ;AACA;AAwHmB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AA5HL;;;AA6HK;;AA5HJ;AACA;AA+HI;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEe;;AAAA;AAAA;;AApJR;;;AAoJoC;AAnJnC;AACA;AAmJO;;AAAA;AAAA;AAAP;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AAlKR;;;AAkK8B;AAjK7B;AACA;AAkKA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;AAA5C;AAzKT;;;AA0KS;;AAzKR;AACA;AA4Ke;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA9LR;;;AA8L8B;AA7L7B;AACA;AA8LA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAtMT;;AAAA;;;AAqNe;AApNd;AACA;AAsNmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEe;;AAAA;AAAA;AAAA;AAAA;;AAhOR;;;AAgO8B;AA/N7B;AACA;AA+NO;;AAAA;AAAA;AAAP;AAAA", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCQ;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAwNK;;AAAA;AAAA;AAAA;;AAAA;AAxNL;;;AAAA;AAAA;;AAwNK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAtLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAsLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA1JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA0JK;;;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;AA5IL;;;AAAA;AAAA;;AA4IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AAnGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAmGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAvEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAuEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAxCL;;;AAwCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAnCL;;;AAAA;;;AAmCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA3BL;;;AAAA;;;AA2BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAhBL;;;AAAA;;;AAAA;;;AAAA;;;AAgBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAXL;;;AAAA;AAAA;;AAWK;;;AAAA;;AAXL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASe;;AAAc;AAAA;AAAA;AAAA;AAAd;AApBR;;;AAoBkC;;AAnBjC;AACA;;AAoBR;;;AAEQ;;;AACA;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9BR;;;AA8B+B;;AA7B9B;AACA;AA6BO;;AAAA;AAAmB;AAAnB;AA/BR;;;AA+B8B;;AA9B7B;AACA;AA+BI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AAzCR;;;AAyC2B;AAxC1B;AACA;AAwCO;;AAAA;AAAmB;AAAnB;AA1CR;;;AA0C8B;;AAzC7B;AACA;AAyCO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AA3CR;;;AA2CyC;;AA1CxC;AACA;AA0CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AAhDR;;;AAgD2B;AA/C1B;AACA;AA+CO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;AADC;AADJ;;;;AAnEL;;;AAsEK;;AArEJ;AACA;;;;;;AAuER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AArFR;;;AAqF8B;AApF7B;AACA;AAqFG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;AADH;AA1FT;;;AA4FS;;AA3FR;AACA;AA8Fe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAlHR;;;AAkH8B;AAjH7B;AACA;AAiHO;;AAAA;AAAA;;AAnHR;;;AAmHoC;AAlHnC;AACA;AAoHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AAxHL;;;AA2HK;AA1HJ;AACA;AA6HmB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAjIL;;;AAkIK;;AAjIJ;AACA;AAoII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEe;;AAAA;AAAA;;AAzJR;;;AAyJoC;AAxJnC;AACA;AAwJO;;AAAA;AAAA;AAAP;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AAvKR;;;AAuK8B;AAtK7B;AACA;AAuKA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;AAA5C;AA9KT;;;AA+KS;;AA9KR;AACA;AAiLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AAnMR;;;AAmM8B;AAlM7B;AACA;AAmMA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AA3MT;;AAAA;;;AA0Ne;AAzNd;AACA;AA2NmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEe;;AAAA;AAAA;AAAA;AAAA;;AArOR;;;AAqO8B;AApO7B;AACA;AAoOO;;AAAA;AAAA;AAAP;AAAA", "op_pc_offset": 0, "pc_events": { "1": { @@ -65,11 +65,11 @@ ] }, "116": { - "op": "bz main_bare_routing@15", + "op": "bz main_bare_routing@16", "stack_out": [] }, "119": { - "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\"", + "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\"", "defined_out": [ "Method(add_label(string,string)void)", "Method(add_label_to_asset(string,asset)void)", @@ -78,6 +78,7 @@ "Method(get_asset_labels(asset)string[])", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", + "Method(log_labels(string[])void)", "Method(remove_label(string)void)", "Method(remove_label_from_asset(string,asset)void)", "Method(remove_operator_from_label(account,string)void)" @@ -87,6 +88,7 @@ "Method(add_label(string,string)void)", "Method(remove_label(string)void)", "Method(get_label(string)(string,uint64,uint64))", + "Method(log_labels(string[])void)", "Method(add_operator_to_label(account,string)void)", "Method(remove_operator_from_label(account,string)void)", "Method(get_operator_labels(account)string[])", @@ -95,7 +97,7 @@ "Method(get_asset_labels(asset)string[])" ] }, - "171": { + "176": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(add_label(string,string)void)", @@ -105,6 +107,7 @@ "Method(get_asset_labels(asset)string[])", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", + "Method(log_labels(string[])void)", "Method(remove_label(string)void)", "Method(remove_label_from_asset(string,asset)void)", "Method(remove_operator_from_label(account,string)void)", @@ -115,6 +118,7 @@ "Method(add_label(string,string)void)", "Method(remove_label(string)void)", "Method(get_label(string)(string,uint64,uint64))", + "Method(log_labels(string[])void)", "Method(add_operator_to_label(account,string)void)", "Method(remove_operator_from_label(account,string)void)", "Method(get_operator_labels(account)string[])", @@ -124,12 +128,12 @@ "tmp%2#0" ] }, - "174": { - "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_add_operator_to_label_route@9 main_remove_operator_from_label_route@10 main_get_operator_labels_route@11 main_add_label_to_asset_route@12 main_remove_label_from_asset_route@13 main_get_asset_labels_route@14", + "179": { + "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15", "stack_out": [] }, - "196": { - "block": "main_after_if_else@17", + "203": { + "block": "main_after_if_else@18", "stack_in": [], "op": "intc_1 // 0", "defined_out": [ @@ -139,50 +143,50 @@ "tmp%0#0" ] }, - "197": { + "204": { "op": "return", "stack_out": [] }, - "198": { - "block": "main_get_asset_labels_route@14", + "205": { + "block": "main_get_asset_labels_route@15", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%71#0" + "tmp%76#0" ], "stack_out": [ - "tmp%71#0" + "tmp%76#0" ] }, - "200": { + "207": { "op": "!", "defined_out": [ - "tmp%72#0" + "tmp%77#0" ], "stack_out": [ - "tmp%72#0" + "tmp%77#0" ] }, - "201": { + "208": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "202": { + "209": { "op": "txn ApplicationID", "defined_out": [ - "tmp%73#0" + "tmp%78#0" ], "stack_out": [ - "tmp%73#0" + "tmp%78#0" ] }, - "204": { + "211": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "205": { + "212": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%6#0" @@ -191,66 +195,66 @@ "reinterpret_bytes[1]%6#0" ] }, - "208": { + "215": { "op": "btoi", "defined_out": [ - "tmp%75#0" + "tmp%80#0" ], "stack_out": [ - "tmp%75#0" + "tmp%80#0" ] }, - "209": { + "216": { "op": "txnas Assets", "defined_out": [ - "tmp%76#0" + "tmp%81#0" ], "stack_out": [ - "tmp%76#0" + "tmp%81#0" ] }, - "211": { + "218": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", "op": "callsub get_asset_labels", "defined_out": [ - "tmp%77#0" + "tmp%82#0" ], "stack_out": [ - "tmp%77#0" + "tmp%82#0" ] }, - "214": { + "221": { "op": "bytec_3 // 0x151f7c75", "defined_out": [ "0x151f7c75", - "tmp%77#0" + "tmp%82#0" ], "stack_out": [ - "tmp%77#0", + "tmp%82#0", "0x151f7c75" ] }, - "215": { + "222": { "op": "swap", "stack_out": [ "0x151f7c75", - "tmp%77#0" + "tmp%82#0" ] }, - "216": { + "223": { "op": "concat", "defined_out": [ - "tmp%78#0" + "tmp%83#0" ], "stack_out": [ - "tmp%78#0" + "tmp%83#0" ] }, - "217": { + "224": { "op": "log", "stack_out": [] }, - "218": { + "225": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -259,106 +263,106 @@ "tmp%0#0" ] }, - "219": { + "226": { "op": "return", "stack_out": [] }, - "220": { - "block": "main_remove_label_from_asset_route@13", + "227": { + "block": "main_remove_label_from_asset_route@14", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%63#0" + "tmp%68#0" ], "stack_out": [ - "tmp%63#0" + "tmp%68#0" ] }, - "222": { + "229": { "op": "!", "defined_out": [ - "tmp%64#0" + "tmp%69#0" ], "stack_out": [ - "tmp%64#0" + "tmp%69#0" ] }, - "223": { + "230": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "224": { + "231": { "op": "txn ApplicationID", "defined_out": [ - "tmp%65#0" + "tmp%70#0" ], "stack_out": [ - "tmp%65#0" + "tmp%70#0" ] }, - "226": { + "233": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "227": { + "234": { "op": "txna ApplicationArgs 1", "defined_out": [ - "tmp%67#0" + "tmp%72#0" ], "stack_out": [ - "tmp%67#0" + "tmp%72#0" ] }, - "230": { + "237": { "op": "extract 2 0", "defined_out": [ - "tmp%68#0" + "tmp%73#0" ], "stack_out": [ - "tmp%68#0" + "tmp%73#0" ] }, - "233": { + "240": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%5#0", - "tmp%68#0" + "tmp%73#0" ], "stack_out": [ - "tmp%68#0", + "tmp%73#0", "reinterpret_bytes[1]%5#0" ] }, - "236": { + "243": { "op": "btoi", "defined_out": [ - "tmp%68#0", - "tmp%69#0" + "tmp%73#0", + "tmp%74#0" ], "stack_out": [ - "tmp%68#0", - "tmp%69#0" + "tmp%73#0", + "tmp%74#0" ] }, - "237": { + "244": { "op": "txnas Assets", "defined_out": [ - "tmp%68#0", - "tmp%70#0" + "tmp%73#0", + "tmp%75#0" ], "stack_out": [ - "tmp%68#0", - "tmp%70#0" + "tmp%73#0", + "tmp%75#0" ] }, - "239": { + "246": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", "op": "callsub remove_label_from_asset", "stack_out": [] }, - "242": { + "249": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -367,106 +371,106 @@ "tmp%0#0" ] }, - "243": { + "250": { "op": "return", "stack_out": [] }, - "244": { - "block": "main_add_label_to_asset_route@12", + "251": { + "block": "main_add_label_to_asset_route@13", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%55#0" + "tmp%60#0" ], "stack_out": [ - "tmp%55#0" + "tmp%60#0" ] }, - "246": { + "253": { "op": "!", "defined_out": [ - "tmp%56#0" + "tmp%61#0" ], "stack_out": [ - "tmp%56#0" + "tmp%61#0" ] }, - "247": { + "254": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "248": { + "255": { "op": "txn ApplicationID", "defined_out": [ - "tmp%57#0" + "tmp%62#0" ], "stack_out": [ - "tmp%57#0" + "tmp%62#0" ] }, - "250": { + "257": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "251": { + "258": { "op": "txna ApplicationArgs 1", "defined_out": [ - "tmp%59#0" + "tmp%64#0" ], "stack_out": [ - "tmp%59#0" + "tmp%64#0" ] }, - "254": { + "261": { "op": "extract 2 0", "defined_out": [ - "tmp%60#0" + "tmp%65#0" ], "stack_out": [ - "tmp%60#0" + "tmp%65#0" ] }, - "257": { + "264": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%4#0", - "tmp%60#0" + "tmp%65#0" ], "stack_out": [ - "tmp%60#0", + "tmp%65#0", "reinterpret_bytes[1]%4#0" ] }, - "260": { + "267": { "op": "btoi", "defined_out": [ - "tmp%60#0", - "tmp%61#0" + "tmp%65#0", + "tmp%66#0" ], "stack_out": [ - "tmp%60#0", - "tmp%61#0" + "tmp%65#0", + "tmp%66#0" ] }, - "261": { + "268": { "op": "txnas Assets", "defined_out": [ - "tmp%60#0", - "tmp%62#0" + "tmp%65#0", + "tmp%67#0" ], "stack_out": [ - "tmp%60#0", - "tmp%62#0" + "tmp%65#0", + "tmp%67#0" ] }, - "263": { + "270": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", "op": "callsub add_label_to_asset", "stack_out": [] }, - "266": { + "273": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -475,50 +479,50 @@ "tmp%0#0" ] }, - "267": { + "274": { "op": "return", "stack_out": [] }, - "268": { - "block": "main_get_operator_labels_route@11", + "275": { + "block": "main_get_operator_labels_route@12", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%47#0" + "tmp%52#0" ], "stack_out": [ - "tmp%47#0" + "tmp%52#0" ] }, - "270": { + "277": { "op": "!", "defined_out": [ - "tmp%48#0" + "tmp%53#0" ], "stack_out": [ - "tmp%48#0" + "tmp%53#0" ] }, - "271": { + "278": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "272": { + "279": { "op": "txn ApplicationID", "defined_out": [ - "tmp%49#0" + "tmp%54#0" ], "stack_out": [ - "tmp%49#0" + "tmp%54#0" ] }, - "274": { + "281": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "275": { + "282": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%3#0" @@ -527,66 +531,66 @@ "reinterpret_bytes[1]%3#0" ] }, - "278": { + "285": { "op": "btoi", "defined_out": [ - "tmp%51#0" + "tmp%56#0" ], "stack_out": [ - "tmp%51#0" + "tmp%56#0" ] }, - "279": { + "286": { "op": "txnas Accounts", "defined_out": [ - "tmp%52#0" + "tmp%57#0" ], "stack_out": [ - "tmp%52#0" + "tmp%57#0" ] }, - "281": { + "288": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", "op": "callsub get_operator_labels", "defined_out": [ - "tmp%53#0" + "tmp%58#0" ], "stack_out": [ - "tmp%53#0" + "tmp%58#0" ] }, - "284": { + "291": { "op": "bytec_3 // 0x151f7c75", "defined_out": [ "0x151f7c75", - "tmp%53#0" + "tmp%58#0" ], "stack_out": [ - "tmp%53#0", + "tmp%58#0", "0x151f7c75" ] }, - "285": { + "292": { "op": "swap", "stack_out": [ "0x151f7c75", - "tmp%53#0" + "tmp%58#0" ] }, - "286": { + "293": { "op": "concat", "defined_out": [ - "tmp%54#0" + "tmp%59#0" ], "stack_out": [ - "tmp%54#0" + "tmp%59#0" ] }, - "287": { + "294": { "op": "log", "stack_out": [] }, - "288": { + "295": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -595,50 +599,50 @@ "tmp%0#0" ] }, - "289": { + "296": { "op": "return", "stack_out": [] }, - "290": { - "block": "main_remove_operator_from_label_route@10", + "297": { + "block": "main_remove_operator_from_label_route@11", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%39#0" + "tmp%44#0" ], "stack_out": [ - "tmp%39#0" + "tmp%44#0" ] }, - "292": { + "299": { "op": "!", "defined_out": [ - "tmp%40#0" + "tmp%45#0" ], "stack_out": [ - "tmp%40#0" + "tmp%45#0" ] }, - "293": { + "300": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "294": { + "301": { "op": "txn ApplicationID", "defined_out": [ - "tmp%41#0" + "tmp%46#0" ], "stack_out": [ - "tmp%41#0" + "tmp%46#0" ] }, - "296": { + "303": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "297": { + "304": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%2#0" @@ -647,52 +651,52 @@ "reinterpret_bytes[1]%2#0" ] }, - "300": { + "307": { "op": "btoi", "defined_out": [ - "tmp%43#0" + "tmp%48#0" ], "stack_out": [ - "tmp%43#0" + "tmp%48#0" ] }, - "301": { + "308": { "op": "txnas Accounts", "defined_out": [ - "tmp%44#0" + "tmp%49#0" ], "stack_out": [ - "tmp%44#0" + "tmp%49#0" ] }, - "303": { + "310": { "op": "txna ApplicationArgs 2", "defined_out": [ - "tmp%44#0", - "tmp%45#0" + "tmp%49#0", + "tmp%50#0" ], "stack_out": [ - "tmp%44#0", - "tmp%45#0" + "tmp%49#0", + "tmp%50#0" ] }, - "306": { + "313": { "op": "extract 2 0", "defined_out": [ - "tmp%44#0", - "tmp%46#0" + "tmp%49#0", + "tmp%51#0" ], "stack_out": [ - "tmp%44#0", - "tmp%46#0" + "tmp%49#0", + "tmp%51#0" ] }, - "309": { + "316": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", "op": "callsub remove_operator_from_label", "stack_out": [] }, - "312": { + "319": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -701,50 +705,50 @@ "tmp%0#0" ] }, - "313": { + "320": { "op": "return", "stack_out": [] }, - "314": { - "block": "main_add_operator_to_label_route@9", + "321": { + "block": "main_add_operator_to_label_route@10", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%31#0" + "tmp%36#0" ], "stack_out": [ - "tmp%31#0" + "tmp%36#0" ] }, - "316": { + "323": { "op": "!", "defined_out": [ - "tmp%32#0" + "tmp%37#0" ], "stack_out": [ - "tmp%32#0" + "tmp%37#0" ] }, - "317": { + "324": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "318": { + "325": { "op": "txn ApplicationID", "defined_out": [ - "tmp%33#0" + "tmp%38#0" ], "stack_out": [ - "tmp%33#0" + "tmp%38#0" ] }, - "320": { + "327": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "321": { + "328": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%1#0" @@ -753,52 +757,52 @@ "reinterpret_bytes[1]%1#0" ] }, - "324": { + "331": { "op": "btoi", "defined_out": [ - "tmp%35#0" + "tmp%40#0" ], "stack_out": [ - "tmp%35#0" + "tmp%40#0" ] }, - "325": { + "332": { "op": "txnas Accounts", "defined_out": [ - "tmp%36#0" + "tmp%41#0" ], "stack_out": [ - "tmp%36#0" + "tmp%41#0" ] }, - "327": { + "334": { "op": "txna ApplicationArgs 2", "defined_out": [ - "tmp%36#0", - "tmp%37#0" + "tmp%41#0", + "tmp%42#0" ], "stack_out": [ - "tmp%36#0", - "tmp%37#0" + "tmp%41#0", + "tmp%42#0" ] }, - "330": { + "337": { "op": "extract 2 0", "defined_out": [ - "tmp%36#0", - "tmp%38#0" + "tmp%41#0", + "tmp%43#0" ], "stack_out": [ - "tmp%36#0", - "tmp%38#0" + "tmp%41#0", + "tmp%43#0" ] }, - "333": { + "340": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", "op": "callsub add_operator_to_label", "stack_out": [] }, - "336": { + "343": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -807,11 +811,77 @@ "tmp%0#0" ] }, - "337": { + "344": { "op": "return", "stack_out": [] }, - "338": { + "345": { + "block": "main_log_labels_route@9", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%31#0" + ], + "stack_out": [ + "tmp%31#0" + ] + }, + "347": { + "op": "!", + "defined_out": [ + "tmp%32#0" + ], + "stack_out": [ + "tmp%32#0" + ] + }, + "348": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "349": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%33#0" + ], + "stack_out": [ + "tmp%33#0" + ] + }, + "351": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "352": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%35#0" + ], + "stack_out": [ + "tmp%35#0" + ] + }, + "355": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", + "op": "callsub log_labels", + "stack_out": [] + }, + "358": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "359": { + "op": "return", + "stack_out": [] + }, + "360": { "block": "main_get_label_route@8", "stack_in": [], "op": "txn OnCompletion", @@ -822,7 +892,7 @@ "tmp%23#0" ] }, - "340": { + "362": { "op": "!", "defined_out": [ "tmp%24#0" @@ -831,12 +901,12 @@ "tmp%24#0" ] }, - "341": { + "363": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "342": { + "364": { "op": "txn ApplicationID", "defined_out": [ "tmp%25#0" @@ -845,12 +915,12 @@ "tmp%25#0" ] }, - "344": { + "366": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "345": { + "367": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%27#0" @@ -859,7 +929,7 @@ "tmp%27#0" ] }, - "348": { + "370": { "op": "extract 2 0", "defined_out": [ "tmp%28#0" @@ -868,7 +938,7 @@ "tmp%28#0" ] }, - "351": { + "373": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "op": "callsub get_label", "defined_out": [ @@ -878,7 +948,7 @@ "tmp%29#0" ] }, - "354": { + "376": { "op": "bytec_3 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -889,14 +959,14 @@ "0x151f7c75" ] }, - "355": { + "377": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%29#0" ] }, - "356": { + "378": { "op": "concat", "defined_out": [ "tmp%30#0" @@ -905,11 +975,11 @@ "tmp%30#0" ] }, - "357": { + "379": { "op": "log", "stack_out": [] }, - "358": { + "380": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -918,11 +988,11 @@ "tmp%0#0" ] }, - "359": { + "381": { "op": "return", "stack_out": [] }, - "360": { + "382": { "block": "main_remove_label_route@7", "stack_in": [], "op": "txn OnCompletion", @@ -933,7 +1003,7 @@ "tmp%17#0" ] }, - "362": { + "384": { "op": "!", "defined_out": [ "tmp%18#0" @@ -942,12 +1012,12 @@ "tmp%18#0" ] }, - "363": { + "385": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "364": { + "386": { "op": "txn ApplicationID", "defined_out": [ "tmp%19#0" @@ -956,12 +1026,12 @@ "tmp%19#0" ] }, - "366": { + "388": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "367": { + "389": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%21#0" @@ -970,7 +1040,7 @@ "tmp%21#0" ] }, - "370": { + "392": { "op": "extract 2 0", "defined_out": [ "tmp%22#0" @@ -979,12 +1049,12 @@ "tmp%22#0" ] }, - "373": { + "395": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "op": "callsub remove_label", "stack_out": [] }, - "376": { + "398": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -993,11 +1063,11 @@ "tmp%0#0" ] }, - "377": { + "399": { "op": "return", "stack_out": [] }, - "378": { + "400": { "block": "main_add_label_route@6", "stack_in": [], "op": "txn OnCompletion", @@ -1008,7 +1078,7 @@ "tmp%9#0" ] }, - "380": { + "402": { "op": "!", "defined_out": [ "tmp%10#0" @@ -1017,12 +1087,12 @@ "tmp%10#0" ] }, - "381": { + "403": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "382": { + "404": { "op": "txn ApplicationID", "defined_out": [ "tmp%11#0" @@ -1031,12 +1101,12 @@ "tmp%11#0" ] }, - "384": { + "406": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "385": { + "407": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%13#0" @@ -1045,7 +1115,7 @@ "tmp%13#0" ] }, - "388": { + "410": { "op": "extract 2 0", "defined_out": [ "tmp%14#0" @@ -1054,7 +1124,7 @@ "tmp%14#0" ] }, - "391": { + "413": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%14#0", @@ -1065,7 +1135,7 @@ "tmp%15#0" ] }, - "394": { + "416": { "op": "extract 2 0", "defined_out": [ "tmp%14#0", @@ -1076,12 +1146,12 @@ "tmp%16#0" ] }, - "397": { + "419": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", "op": "callsub add_label", "stack_out": [] }, - "400": { + "422": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1090,11 +1160,11 @@ "tmp%0#0" ] }, - "401": { + "423": { "op": "return", "stack_out": [] }, - "402": { + "424": { "block": "main_change_admin_route@5", "stack_in": [], "op": "txn OnCompletion", @@ -1105,7 +1175,7 @@ "tmp%3#0" ] }, - "404": { + "426": { "op": "!", "defined_out": [ "tmp%4#0" @@ -1114,12 +1184,12 @@ "tmp%4#0" ] }, - "405": { + "427": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "406": { + "428": { "op": "txn ApplicationID", "defined_out": [ "tmp%5#0" @@ -1128,12 +1198,12 @@ "tmp%5#0" ] }, - "408": { + "430": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "409": { + "431": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%0#0" @@ -1142,7 +1212,7 @@ "reinterpret_bytes[1]%0#0" ] }, - "412": { + "434": { "op": "btoi", "defined_out": [ "tmp%7#0" @@ -1151,7 +1221,7 @@ "tmp%7#0" ] }, - "413": { + "435": { "op": "txnas Accounts", "defined_out": [ "tmp%8#0" @@ -1160,12 +1230,12 @@ "tmp%8#0" ] }, - "415": { + "437": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", "op": "callsub change_admin", "stack_out": [] }, - "418": { + "440": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1174,49 +1244,49 @@ "tmp%0#0" ] }, - "419": { + "441": { "op": "return", "stack_out": [] }, - "420": { - "block": "main_bare_routing@15", + "442": { + "block": "main_bare_routing@16", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%79#0" + "tmp%84#0" ], "stack_out": [ - "tmp%79#0" + "tmp%84#0" ] }, - "422": { - "op": "bnz main_after_if_else@17", + "444": { + "op": "bnz main_after_if_else@18", "stack_out": [] }, - "425": { + "447": { "op": "txn ApplicationID", "defined_out": [ - "tmp%80#0" + "tmp%85#0" ], "stack_out": [ - "tmp%80#0" + "tmp%85#0" ] }, - "427": { + "449": { "op": "!", "defined_out": [ - "tmp%81#0" + "tmp%86#0" ], "stack_out": [ - "tmp%81#0" + "tmp%86#0" ] }, - "428": { + "450": { "error": "can only call when creating", "op": "assert // can only call when creating", "stack_out": [] }, - "429": { + "451": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1225,11 +1295,11 @@ "tmp%0#0" ] }, - "430": { + "452": { "op": "return", "stack_out": [] }, - "431": { + "453": { "subroutine": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "params": { "array#0": "bytes", @@ -1240,7 +1310,7 @@ "stack_in": [], "op": "proto 3 1" }, - "434": { + "456": { "op": "frame_dig -3", "defined_out": [ "array#0 (copy)" @@ -1249,7 +1319,7 @@ "array#0 (copy)" ] }, - "436": { + "458": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -1260,7 +1330,7 @@ "0" ] }, - "437": { + "459": { "op": "extract_uint16", "defined_out": [ "array_length#0" @@ -1269,7 +1339,7 @@ "array_length#0" ] }, - "438": { + "460": { "op": "dup", "defined_out": [ "array_length#0", @@ -1280,7 +1350,7 @@ "array_length#0 (copy)" ] }, - "439": { + "461": { "op": "frame_dig -1", "defined_out": [ "array_length#0", @@ -1293,7 +1363,7 @@ "new_items_count#0 (copy)" ] }, - "441": { + "463": { "op": "+", "defined_out": [ "array_length#0", @@ -1304,14 +1374,14 @@ "new_length#0" ] }, - "442": { + "464": { "op": "swap", "stack_out": [ "new_length#0", "array_length#0" ] }, - "443": { + "465": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -1324,7 +1394,7 @@ "2" ] }, - "444": { + "466": { "op": "*", "defined_out": [ "new_length#0", @@ -1335,7 +1405,7 @@ "tmp%0#0" ] }, - "445": { + "467": { "op": "intc_2 // 2", "stack_out": [ "new_length#0", @@ -1343,7 +1413,7 @@ "2" ] }, - "446": { + "468": { "op": "+", "defined_out": [ "header_end#0", @@ -1354,7 +1424,7 @@ "header_end#0" ] }, - "447": { + "469": { "op": "dig 1", "defined_out": [ "header_end#0", @@ -1367,7 +1437,7 @@ "new_length#0 (copy)" ] }, - "449": { + "471": { "op": "itob", "defined_out": [ "header_end#0", @@ -1380,7 +1450,7 @@ "tmp%1#0" ] }, - "450": { + "472": { "op": "extract 6 2", "defined_out": [ "header_end#0", @@ -1393,7 +1463,7 @@ "tmp%2#0" ] }, - "453": { + "475": { "op": "cover 2", "defined_out": [ "header_end#0", @@ -1406,7 +1476,7 @@ "header_end#0" ] }, - "455": { + "477": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1415,7 +1485,7 @@ "array#0 (copy)" ] }, - "457": { + "479": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1425,7 +1495,7 @@ "2" ] }, - "458": { + "480": { "op": "dig 2", "defined_out": [ "2", @@ -1444,7 +1514,7 @@ "header_end#0 (copy)" ] }, - "460": { + "482": { "op": "substring3", "defined_out": [ "header_end#0", @@ -1459,7 +1529,7 @@ "tmp%3#0" ] }, - "461": { + "483": { "op": "frame_dig -1", "stack_out": [ "tmp%2#0", @@ -1469,7 +1539,7 @@ "new_items_count#0 (copy)" ] }, - "463": { + "485": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1480,7 +1550,7 @@ "2" ] }, - "464": { + "486": { "op": "*", "defined_out": [ "header_end#0", @@ -1497,7 +1567,7 @@ "tmp%4#0" ] }, - "465": { + "487": { "op": "bzero", "defined_out": [ "header_end#0", @@ -1514,7 +1584,7 @@ "tmp%5#0" ] }, - "466": { + "488": { "op": "concat", "defined_out": [ "header_end#0", @@ -1529,7 +1599,7 @@ "tmp%6#0" ] }, - "467": { + "489": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1539,7 +1609,7 @@ "array#0 (copy)" ] }, - "469": { + "491": { "op": "len", "defined_out": [ "header_end#0", @@ -1556,7 +1626,7 @@ "tmp%7#0" ] }, - "470": { + "492": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1567,7 +1637,7 @@ "array#0 (copy)" ] }, - "472": { + "494": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -1578,7 +1648,7 @@ "header_end#0" ] }, - "474": { + "496": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -1589,7 +1659,7 @@ "tmp%7#0" ] }, - "476": { + "498": { "op": "substring3", "defined_out": [ "new_length#0", @@ -1604,7 +1674,7 @@ "tmp%8#0" ] }, - "477": { + "499": { "op": "concat", "defined_out": [ "new_length#0", @@ -1617,7 +1687,7 @@ "tmp%9#0" ] }, - "478": { + "500": { "op": "frame_dig -2", "defined_out": [ "new_items_bytes#0 (copy)", @@ -1632,7 +1702,7 @@ "new_items_bytes#0 (copy)" ] }, - "480": { + "502": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -1645,7 +1715,7 @@ "array_head_and_tail#0" ] }, - "481": { + "503": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -1658,7 +1728,7 @@ "new_length#0" ] }, - "482": { + "504": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1667,7 +1737,7 @@ "2" ] }, - "483": { + "505": { "op": "*", "defined_out": [ "array_head_and_tail#0", @@ -1680,7 +1750,7 @@ "tail_offset#0" ] }, - "484": { + "506": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -1694,7 +1764,7 @@ "tail_offset#0" ] }, - "485": { + "507": { "op": "intc_1 // 0", "defined_out": [ "array_head_and_tail#0", @@ -1710,7 +1780,7 @@ "head_offset#0" ] }, - "486": { + "508": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -1727,7 +1797,7 @@ "tail_offset#1" ] }, - "487": { + "509": { "block": "dynamic_array_concat_byte_length_head_for_header@2", "stack_in": [ "tmp%2#0", @@ -1749,7 +1819,7 @@ "head_offset#0" ] }, - "489": { + "511": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -1765,7 +1835,7 @@ "tail_offset#0" ] }, - "491": { + "513": { "op": "<", "defined_out": [ "continue_looping%0#0", @@ -1781,7 +1851,7 @@ "continue_looping%0#0" ] }, - "492": { + "514": { "op": "bz dynamic_array_concat_byte_length_head_after_for@5", "stack_out": [ "tmp%2#0", @@ -1791,7 +1861,7 @@ "tail_offset#1" ] }, - "495": { + "517": { "op": "frame_dig 4", "defined_out": [ "head_offset#0", @@ -1807,7 +1877,7 @@ "tail_offset#1" ] }, - "497": { + "519": { "op": "dup", "defined_out": [ "head_offset#0", @@ -1825,7 +1895,7 @@ "tail_offset#1 (copy)" ] }, - "498": { + "520": { "op": "itob", "defined_out": [ "head_offset#0", @@ -1843,7 +1913,7 @@ "tmp%5#0" ] }, - "499": { + "521": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -1861,7 +1931,7 @@ "tail_offset_bytes#0" ] }, - "502": { + "524": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -1881,7 +1951,7 @@ "array_head_and_tail#0" ] }, - "504": { + "526": { "op": "frame_dig 3", "stack_out": [ "tmp%2#0", @@ -1895,7 +1965,7 @@ "head_offset#0" ] }, - "506": { + "528": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -1918,7 +1988,7 @@ "head_offset#0 (copy)" ] }, - "507": { + "529": { "op": "cover 4", "stack_out": [ "tmp%2#0", @@ -1933,7 +2003,7 @@ "head_offset#0 (copy)" ] }, - "509": { + "531": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -1948,7 +2018,7 @@ "tail_offset_bytes#0" ] }, - "511": { + "533": { "op": "replace3", "stack_out": [ "tmp%2#0", @@ -1961,7 +2031,7 @@ "array_head_and_tail#0" ] }, - "512": { + "534": { "op": "dup", "stack_out": [ "tmp%2#0", @@ -1975,7 +2045,7 @@ "array_head_and_tail#0" ] }, - "513": { + "535": { "op": "frame_bury 1", "defined_out": [ "array_head_and_tail#0", @@ -1994,7 +2064,7 @@ "array_head_and_tail#0" ] }, - "515": { + "537": { "op": "dig 1", "stack_out": [ "tmp%2#0", @@ -2008,7 +2078,7 @@ "tail_offset#1 (copy)" ] }, - "517": { + "539": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail#0", @@ -2028,7 +2098,7 @@ "tmp%6#1" ] }, - "518": { + "540": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2050,7 +2120,7 @@ "2" ] }, - "519": { + "541": { "op": "+", "defined_out": [ "array_head_and_tail#0", @@ -2070,7 +2140,7 @@ "tmp%7#0" ] }, - "520": { + "542": { "op": "+", "stack_out": [ "tmp%2#0", @@ -2082,7 +2152,7 @@ "tail_offset#1" ] }, - "521": { + "543": { "op": "frame_bury 4", "defined_out": [ "array_head_and_tail#0", @@ -2099,7 +2169,7 @@ "head_offset#0" ] }, - "523": { + "545": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -2111,7 +2181,7 @@ "2" ] }, - "524": { + "546": { "op": "+", "stack_out": [ "tmp%2#0", @@ -2122,7 +2192,7 @@ "head_offset#0" ] }, - "525": { + "547": { "op": "frame_bury 3", "stack_out": [ "tmp%2#0", @@ -2132,10 +2202,10 @@ "tail_offset#1" ] }, - "527": { + "549": { "op": "b dynamic_array_concat_byte_length_head_for_header@2" }, - "530": { + "552": { "block": "dynamic_array_concat_byte_length_head_after_for@5", "stack_in": [ "tmp%2#0", @@ -2157,7 +2227,7 @@ "tmp%2#0" ] }, - "532": { + "554": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -2173,7 +2243,7 @@ "array_head_and_tail#0" ] }, - "534": { + "556": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -2189,14 +2259,14 @@ "tmp%12#0" ] }, - "535": { + "557": { "op": "frame_bury 0" }, - "537": { + "559": { "retsub": true, "op": "retsub" }, - "538": { + "560": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "params": {}, "block": "admin_only", @@ -2209,7 +2279,7 @@ "tmp%0#0" ] }, - "540": { + "562": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -2220,7 +2290,7 @@ "0" ] }, - "541": { + "563": { "op": "bytec_1 // \"admin\"", "defined_out": [ "\"admin\"", @@ -2233,7 +2303,7 @@ "\"admin\"" ] }, - "542": { + "564": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -2246,7 +2316,7 @@ "maybe_exists%0#0" ] }, - "543": { + "565": { "error": "check self.admin exists", "op": "assert // check self.admin exists", "stack_out": [ @@ -2254,7 +2324,7 @@ "maybe_value%0#0" ] }, - "544": { + "566": { "op": "==", "defined_out": [ "cond#0" @@ -2263,11 +2333,11 @@ "cond#0" ] }, - "545": { + "567": { "op": "bnz admin_only_after_if_else@3", "stack_out": [] }, - "548": { + "570": { "op": "bytec 5 // \"ERR:UNAUTH\"", "defined_out": [ "\"ERR:UNAUTH\"" @@ -2276,20 +2346,20 @@ "\"ERR:UNAUTH\"" ] }, - "550": { + "572": { "op": "log", "stack_out": [] }, - "551": { + "573": { "op": "err" }, - "552": { + "574": { "block": "admin_only_after_if_else@3", "stack_in": [], "retsub": true, "op": "retsub" }, - "553": { + "575": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", "params": { "new_admin#0": "bytes" @@ -2298,11 +2368,11 @@ "stack_in": [], "op": "proto 1 0" }, - "556": { + "578": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "559": { + "581": { "op": "bytec_1 // \"admin\"", "defined_out": [ "\"admin\"" @@ -2311,7 +2381,7 @@ "\"admin\"" ] }, - "560": { + "582": { "op": "frame_dig -1", "defined_out": [ "\"admin\"", @@ -2322,15 +2392,15 @@ "new_admin#0 (copy)" ] }, - "562": { + "584": { "op": "app_global_put", "stack_out": [] }, - "563": { + "585": { "retsub": true, "op": "retsub" }, - "564": { + "586": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", "params": { "id#0": "bytes", @@ -2340,11 +2410,11 @@ "stack_in": [], "op": "proto 2 0" }, - "567": { + "589": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "570": { + "592": { "op": "frame_dig -2", "defined_out": [ "id#0 (copy)" @@ -2353,7 +2423,7 @@ "id#0 (copy)" ] }, - "572": { + "594": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -2364,17 +2434,17 @@ "maybe_exists%0#0" ] }, - "573": { + "595": { "op": "bury 1", "stack_out": [ "maybe_exists%0#0" ] }, - "575": { + "597": { "op": "bz add_label_after_if_else@3", "stack_out": [] }, - "578": { + "600": { "op": "bytec 4 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -2383,14 +2453,14 @@ "\"ERR:EXISTS\"" ] }, - "580": { + "602": { "op": "log", "stack_out": [] }, - "581": { + "603": { "op": "err" }, - "582": { + "604": { "block": "add_label_after_if_else@3", "stack_in": [], "op": "frame_dig -2", @@ -2401,7 +2471,7 @@ "id#0 (copy)" ] }, - "584": { + "606": { "op": "len", "defined_out": [ "tmp%2#0" @@ -2410,7 +2480,7 @@ "tmp%2#0" ] }, - "585": { + "607": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2421,7 +2491,7 @@ "2" ] }, - "586": { + "608": { "op": "==", "defined_out": [ "cond#1" @@ -2430,11 +2500,11 @@ "cond#1" ] }, - "587": { + "609": { "op": "bnz add_label_after_if_else@7", "stack_out": [] }, - "590": { + "612": { "op": "bytec 6 // \"ERR:LENGTH\"", "defined_out": [ "\"ERR:LENGTH\"" @@ -2443,14 +2513,14 @@ "\"ERR:LENGTH\"" ] }, - "592": { + "614": { "op": "log", "stack_out": [] }, - "593": { + "615": { "op": "err" }, - "594": { + "616": { "block": "add_label_after_if_else@7", "stack_in": [], "op": "frame_dig -1", @@ -2461,7 +2531,7 @@ "name#0 (copy)" ] }, - "596": { + "618": { "op": "len", "defined_out": [ "length%0#0" @@ -2470,7 +2540,7 @@ "length%0#0" ] }, - "597": { + "619": { "op": "itob", "defined_out": [ "as_bytes%0#0" @@ -2479,7 +2549,7 @@ "as_bytes%0#0" ] }, - "598": { + "620": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0" @@ -2488,14 +2558,14 @@ "length_uint16%0#0" ] }, - "601": { + "623": { "op": "frame_dig -1", "stack_out": [ "length_uint16%0#0", "name#0 (copy)" ] }, - "603": { + "625": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -2504,7 +2574,7 @@ "encoded_value%0#0" ] }, - "604": { + "626": { "op": "pushbytes 0x001200000000000000000000000000000000", "defined_out": [ "0x001200000000000000000000000000000000", @@ -2515,14 +2585,14 @@ "0x001200000000000000000000000000000000" ] }, - "624": { + "646": { "op": "swap", "stack_out": [ "0x001200000000000000000000000000000000", "encoded_value%0#0" ] }, - "625": { + "647": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%4#0" @@ -2531,7 +2601,7 @@ "encoded_tuple_buffer%4#0" ] }, - "626": { + "648": { "op": "frame_dig -2", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -2542,7 +2612,7 @@ "id#0 (copy)" ] }, - "628": { + "650": { "op": "box_del", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -2553,35 +2623,35 @@ "{box_del}" ] }, - "629": { + "651": { "op": "pop", "stack_out": [ "encoded_tuple_buffer%4#0" ] }, - "630": { + "652": { "op": "frame_dig -2", "stack_out": [ "encoded_tuple_buffer%4#0", "id#0 (copy)" ] }, - "632": { + "654": { "op": "swap", "stack_out": [ "id#0 (copy)", "encoded_tuple_buffer%4#0" ] }, - "633": { + "655": { "op": "box_put", "stack_out": [] }, - "634": { + "656": { "retsub": true, "op": "retsub" }, - "635": { + "657": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "params": { "id#0": "bytes" @@ -2590,11 +2660,11 @@ "stack_in": [], "op": "proto 1 0" }, - "638": { + "660": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "641": { + "663": { "op": "frame_dig -1", "defined_out": [ "id#0 (copy)" @@ -2603,7 +2673,7 @@ "id#0 (copy)" ] }, - "643": { + "665": { "op": "box_len", "defined_out": [ "cond#0", @@ -2614,17 +2684,17 @@ "cond#0" ] }, - "644": { + "666": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "646": { + "668": { "op": "bnz remove_label_after_if_else@3", "stack_out": [] }, - "649": { + "671": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -2633,14 +2703,14 @@ "\"ERR:NOEXIST\"" ] }, - "650": { + "672": { "op": "log", "stack_out": [] }, - "651": { + "673": { "op": "err" }, - "652": { + "674": { "block": "remove_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -2651,7 +2721,7 @@ "id#0 (copy)" ] }, - "654": { + "676": { "op": "len", "defined_out": [ "tmp%1#0" @@ -2660,7 +2730,7 @@ "tmp%1#0" ] }, - "655": { + "677": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2671,7 +2741,7 @@ "2" ] }, - "656": { + "678": { "op": "==", "defined_out": [ "cond#0" @@ -2680,11 +2750,11 @@ "cond#0" ] }, - "657": { + "679": { "op": "bnz remove_label_after_if_else@7", "stack_out": [] }, - "660": { + "682": { "op": "bytec 6 // \"ERR:LENGTH\"", "defined_out": [ "\"ERR:LENGTH\"" @@ -2693,14 +2763,14 @@ "\"ERR:LENGTH\"" ] }, - "662": { + "684": { "op": "log", "stack_out": [] }, - "663": { + "685": { "op": "err" }, - "664": { + "686": { "block": "remove_label_after_if_else@7", "stack_in": [], "op": "frame_dig -1", @@ -2711,7 +2781,7 @@ "id#0 (copy)" ] }, - "666": { + "688": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -2722,14 +2792,14 @@ "maybe_exists%1#0" ] }, - "667": { + "689": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "668": { + "690": { "error": "Index access is out of bounds", "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ @@ -2739,7 +2809,7 @@ "reinterpret_biguint%0#0" ] }, - "671": { + "693": { "op": "bytec 7 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", @@ -2750,7 +2820,7 @@ "0x0000000000000000" ] }, - "673": { + "695": { "op": "b==", "defined_out": [ "cond#0" @@ -2759,11 +2829,11 @@ "cond#0" ] }, - "674": { + "696": { "op": "bnz remove_label_after_if_else@11", "stack_out": [] }, - "677": { + "699": { "op": "bytec 8 // \"ERR:NOEMPTY\"", "defined_out": [ "\"ERR:NOEMPTY\"" @@ -2772,14 +2842,14 @@ "\"ERR:NOEMPTY\"" ] }, - "679": { + "701": { "op": "log", "stack_out": [] }, - "680": { + "702": { "op": "err" }, - "681": { + "703": { "block": "remove_label_after_if_else@11", "stack_in": [], "op": "frame_dig -1", @@ -2790,7 +2860,7 @@ "id#0 (copy)" ] }, - "683": { + "705": { "op": "box_del", "defined_out": [ "{box_del}" @@ -2799,15 +2869,15 @@ "{box_del}" ] }, - "684": { + "706": { "op": "pop", "stack_out": [] }, - "685": { + "707": { "retsub": true, "op": "retsub" }, - "686": { + "708": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "params": { "id#0": "bytes" @@ -2816,7 +2886,7 @@ "stack_in": [], "op": "proto 1 1" }, - "689": { + "711": { "op": "frame_dig -1", "defined_out": [ "id#0 (copy)" @@ -2825,7 +2895,7 @@ "id#0 (copy)" ] }, - "691": { + "713": { "op": "box_len", "defined_out": [ "cond#0", @@ -2836,66 +2906,479 @@ "cond#0" ] }, - "692": { + "714": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "694": { - "op": "bnz get_label_after_if_else@3", - "stack_out": [] + "716": { + "op": "bnz get_label_after_if_else@3", + "stack_out": [] + }, + "719": { + "op": "bytec_0 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "\"ERR:NOEXIST\"" + ] + }, + "720": { + "op": "log", + "stack_out": [] + }, + "721": { + "op": "err" + }, + "722": { + "block": "get_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "724": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "725": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "726": { + "retsub": true, + "op": "retsub" + }, + "727": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", + "params": { + "ids#0": "bytes" + }, + "block": "log_labels", + "stack_in": [], + "op": "proto 1 0" + }, + "730": { + "op": "frame_dig -1", + "defined_out": [ + "ids#0 (copy)" + ], + "stack_out": [ + "ids#0 (copy)" + ] + }, + "732": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "ids#0 (copy)" + ], + "stack_out": [ + "ids#0 (copy)", + "0" + ] + }, + "733": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "734": { + "op": "intc_1 // 0", + "defined_out": [ + "_idx#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0" + ] + }, + "735": { + "block": "log_labels_for_header@1", + "stack_in": [ + "array_length%0#0", + "_idx#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_idx#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0" + ] + }, + "737": { + "op": "frame_dig 0", + "defined_out": [ + "_idx#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_length%0#0" + ] + }, + "739": { + "op": "<", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "continue_looping%0#0" + ] + }, + "740": { + "op": "bz log_labels_after_for@4", + "stack_out": [ + "array_length%0#0", + "_idx#0" + ] + }, + "743": { + "op": "frame_dig -1", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "ids#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "ids#0 (copy)" + ] + }, + "745": { + "op": "extract 2 0", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "array_head_and_tail%0#0" + ] + }, + "748": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0" + ] + }, + "750": { + "op": "dup", + "defined_out": [ + "_idx#0", + "_idx#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)", + "_idx#0 (copy)" + ] + }, + "751": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)" + ] + }, + "753": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "_idx#0", + "_idx#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)", + "2" + ] + }, + "754": { + "op": "*", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0" + ] + }, + "755": { + "op": "dig 1", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "item_offset_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "757": { + "op": "swap", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" + ] + }, + "758": { + "op": "extract_uint16", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "759": { + "op": "dup2", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "item_offset%0#0", + "item_offset%0#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" + ] + }, + "760": { + "op": "extract_uint16", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" + ] + }, + "761": { + "op": "intc_2 // 2", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" + ] + }, + "762": { + "op": "+", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_head_tail_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" + ] + }, + "763": { + "op": "extract3", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "label_id#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "label_id#0" + ] + }, + "764": { + "op": "extract 2 0", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "tmp%0#0" + ] + }, + "767": { + "op": "box_get", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "768": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "maybe_value%0#0" + ] + }, + "769": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0" + ] }, - "697": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "770": { + "op": "intc_0 // 1", "defined_out": [ - "\"ERR:NOEXIST\"" + "1", + "_idx#0", + "array_length%0#0" ], "stack_out": [ - "\"ERR:NOEXIST\"" + "array_length%0#0", + "_idx#0", + "_idx#0", + "1" ] }, - "698": { - "op": "log", - "stack_out": [] - }, - "699": { - "op": "err" - }, - "700": { - "block": "get_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], + "771": { + "op": "+", "stack_out": [ - "id#0 (copy)" + "array_length%0#0", + "_idx#0", + "_idx#0" ] }, - "702": { - "op": "box_get", + "772": { + "op": "frame_bury 1", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" + "_idx#0", + "array_length%0#0" ], "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" + "array_length%0#0", + "_idx#0" ] }, - "703": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "maybe_value%1#0" - ] + "774": { + "op": "b log_labels_for_header@1" }, - "704": { + "777": { + "block": "log_labels_after_for@4", + "stack_in": [ + "array_length%0#0", + "_idx#0" + ], "retsub": true, "op": "retsub" }, - "705": { + "778": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "params": { "label#0": "bytes" @@ -2904,7 +3387,7 @@ "stack_in": [], "op": "proto 1 0" }, - "708": { + "781": { "op": "txn Sender", "defined_out": [ "tmp%0#0" @@ -2913,7 +3396,7 @@ "tmp%0#0" ] }, - "710": { + "783": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -2924,7 +3407,7 @@ "0" ] }, - "711": { + "784": { "op": "bytec_1 // \"admin\"", "defined_out": [ "\"admin\"", @@ -2937,7 +3420,7 @@ "\"admin\"" ] }, - "712": { + "785": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -2950,7 +3433,7 @@ "maybe_exists%0#0" ] }, - "713": { + "786": { "error": "check self.admin exists", "op": "assert // check self.admin exists", "stack_out": [ @@ -2958,7 +3441,7 @@ "maybe_value%0#0" ] }, - "714": { + "787": { "op": "==", "defined_out": [ "tmp%1#0" @@ -2967,15 +3450,15 @@ "tmp%1#0" ] }, - "715": { + "788": { "op": "bz admin_or_operator_only_after_if_else@2", "stack_out": [] }, - "718": { + "791": { "retsub": true, "op": "retsub" }, - "719": { + "792": { "block": "admin_or_operator_only_after_if_else@2", "stack_in": [], "op": "frame_dig -1", @@ -2986,16 +3469,16 @@ "label#0 (copy)" ] }, - "721": { + "794": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [] }, - "724": { + "797": { "retsub": true, "op": "retsub" }, - "725": { + "798": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "params": { "label#0": "bytes" @@ -3004,7 +3487,7 @@ "stack_in": [], "op": "proto 1 0" }, - "728": { + "801": { "op": "txn Sender", "defined_out": [ "tmp%0#0" @@ -3013,7 +3496,7 @@ "tmp%0#0" ] }, - "730": { + "803": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -3024,7 +3507,7 @@ "label#0 (copy)" ] }, - "732": { + "805": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -3034,7 +3517,7 @@ "tmp%1#0" ] }, - "735": { + "808": { "op": "intc 4 // 4294967296", "defined_out": [ "4294967296", @@ -3045,7 +3528,7 @@ "4294967296" ] }, - "737": { + "810": { "op": "!=", "defined_out": [ "tmp%2#0" @@ -3054,11 +3537,11 @@ "tmp%2#0" ] }, - "738": { + "811": { "op": "bz operator_only_bool_false@3", "stack_out": [] }, - "741": { + "814": { "op": "txn Sender", "defined_out": [ "tmp%3#0" @@ -3067,14 +3550,14 @@ "tmp%3#0" ] }, - "743": { + "816": { "op": "frame_dig -1", "stack_out": [ "tmp%3#0", "label#0 (copy)" ] }, - "745": { + "818": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -3084,7 +3567,7 @@ "tmp%4#0" ] }, - "748": { + "821": { "op": "intc_3 // 4294967295", "defined_out": [ "4294967295", @@ -3095,7 +3578,7 @@ "4294967295" ] }, - "749": { + "822": { "op": "!=", "defined_out": [ "tmp%5#0" @@ -3104,11 +3587,11 @@ "tmp%5#0" ] }, - "750": { + "823": { "op": "bz operator_only_bool_false@3", "stack_out": [] }, - "753": { + "826": { "op": "intc_0 // 1", "defined_out": [ "cond#0" @@ -3117,7 +3600,7 @@ "cond#0" ] }, - "754": { + "827": { "block": "operator_only_bool_merge@4", "stack_in": [ "cond#0" @@ -3126,7 +3609,7 @@ "defined_out": [], "stack_out": [] }, - "757": { + "830": { "op": "bytec 5 // \"ERR:UNAUTH\"", "defined_out": [ "\"ERR:UNAUTH\"" @@ -3135,20 +3618,20 @@ "\"ERR:UNAUTH\"" ] }, - "759": { + "832": { "op": "log", "stack_out": [] }, - "760": { + "833": { "op": "err" }, - "761": { + "834": { "block": "operator_only_after_if_else@7", "stack_in": [], "retsub": true, "op": "retsub" }, - "762": { + "835": { "block": "operator_only_bool_false@3", "stack_in": [], "op": "intc_1 // 0", @@ -3159,10 +3642,10 @@ "cond#0" ] }, - "763": { + "836": { "op": "b operator_only_bool_merge@4" }, - "766": { + "839": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "params": { "operator#0": "bytes", @@ -3172,20 +3655,20 @@ "stack_in": [], "op": "proto 2 1" }, - "769": { + "842": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#0" ] }, - "770": { + "843": { "op": "bytec_2 // \"\"", "stack_out": [ "maybe_value%1#0", "array_length%0#0" ] }, - "771": { + "844": { "op": "dup", "stack_out": [ "maybe_value%1#0", @@ -3193,7 +3676,7 @@ "idx#0" ] }, - "772": { + "845": { "op": "frame_dig -2", "defined_out": [ "operator#0 (copy)" @@ -3205,7 +3688,7 @@ "operator#0 (copy)" ] }, - "774": { + "847": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -3219,7 +3702,7 @@ "maybe_exists%0#0" ] }, - "775": { + "848": { "op": "bury 1", "stack_out": [ "maybe_value%1#0", @@ -3228,7 +3711,7 @@ "maybe_exists%0#0" ] }, - "777": { + "850": { "op": "bnz get_operator_label_index_after_if_else@2", "stack_out": [ "maybe_value%1#0", @@ -3236,7 +3719,7 @@ "idx#0" ] }, - "780": { + "853": { "op": "intc 4 // 4294967296", "defined_out": [ "4294967296" @@ -3248,14 +3731,14 @@ "4294967296" ] }, - "782": { + "855": { "op": "frame_bury 0" }, - "784": { + "857": { "retsub": true, "op": "retsub" }, - "785": { + "858": { "block": "get_operator_label_index_after_if_else@2", "stack_in": [ "maybe_value%1#0", @@ -3273,7 +3756,7 @@ "operator#0 (copy)" ] }, - "787": { + "860": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -3287,7 +3770,7 @@ "maybe_exists%1#0" ] }, - "788": { + "861": { "op": "swap", "stack_out": [ "maybe_value%1#0", @@ -3297,7 +3780,7 @@ "maybe_value%1#0" ] }, - "789": { + "862": { "op": "dup", "stack_out": [ "maybe_value%1#0", @@ -3308,7 +3791,7 @@ "maybe_value%1#0 (copy)" ] }, - "790": { + "863": { "op": "cover 2", "stack_out": [ "maybe_value%1#0", @@ -3319,7 +3802,7 @@ "maybe_value%1#0" ] }, - "792": { + "865": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%1#0", @@ -3333,7 +3816,7 @@ "maybe_exists%1#0" ] }, - "794": { + "867": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -3343,7 +3826,7 @@ "maybe_value%1#0" ] }, - "795": { + "868": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#0", @@ -3353,7 +3836,7 @@ "0" ] }, - "796": { + "869": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -3366,7 +3849,7 @@ "array_length%0#0" ] }, - "797": { + "870": { "op": "frame_bury 1", "defined_out": [ "array_length%0#0", @@ -3378,7 +3861,7 @@ "idx#0" ] }, - "799": { + "872": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -3392,7 +3875,7 @@ "idx#0" ] }, - "800": { + "873": { "op": "frame_bury 2", "defined_out": [ "array_length%0#0", @@ -3405,7 +3888,7 @@ "idx#0" ] }, - "802": { + "875": { "block": "get_operator_label_index_for_header@3", "stack_in": [ "maybe_value%1#0", @@ -3423,7 +3906,7 @@ "idx#0" ] }, - "804": { + "877": { "op": "frame_dig 1", "defined_out": [ "array_length%0#0", @@ -3437,7 +3920,7 @@ "array_length%0#0" ] }, - "806": { + "879": { "op": "<", "defined_out": [ "array_length%0#0", @@ -3451,7 +3934,7 @@ "continue_looping%0#0" ] }, - "807": { + "880": { "op": "bz get_operator_label_index_after_for@8", "stack_out": [ "maybe_value%1#0", @@ -3459,7 +3942,7 @@ "idx#0" ] }, - "810": { + "883": { "op": "frame_dig 0", "defined_out": [ "array_length%0#0", @@ -3473,7 +3956,7 @@ "maybe_value%1#0" ] }, - "812": { + "885": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -3488,7 +3971,7 @@ "array_head_and_tail%0#0" ] }, - "815": { + "888": { "op": "frame_dig 2", "stack_out": [ "maybe_value%1#0", @@ -3498,7 +3981,7 @@ "idx#0" ] }, - "817": { + "890": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -3516,7 +3999,7 @@ "2" ] }, - "818": { + "891": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -3533,7 +4016,7 @@ "item_offset_offset%0#0" ] }, - "819": { + "892": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -3552,7 +4035,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "821": { + "894": { "op": "swap", "stack_out": [ "maybe_value%1#0", @@ -3563,7 +4046,7 @@ "item_offset_offset%0#0" ] }, - "822": { + "895": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -3580,7 +4063,7 @@ "item_offset%0#0" ] }, - "823": { + "896": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -3601,7 +4084,7 @@ "item_offset%0#0 (copy)" ] }, - "824": { + "897": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -3620,7 +4103,7 @@ "item_length%0#0" ] }, - "825": { + "898": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%1#0", @@ -3632,7 +4115,7 @@ "2" ] }, - "826": { + "899": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -3651,7 +4134,7 @@ "item_head_tail_length%0#0" ] }, - "827": { + "900": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -3666,7 +4149,7 @@ "stored_label#0" ] }, - "828": { + "901": { "op": "extract 2 0", "defined_out": [ "array_length%0#0", @@ -3681,7 +4164,7 @@ "tmp%2#0" ] }, - "831": { + "904": { "op": "frame_dig -1", "defined_out": [ "array_length%0#0", @@ -3698,7 +4181,7 @@ "label#0 (copy)" ] }, - "833": { + "906": { "op": "==", "defined_out": [ "array_length%0#0", @@ -3713,7 +4196,7 @@ "tmp%3#0" ] }, - "834": { + "907": { "op": "bz get_operator_label_index_after_if_else@6", "stack_out": [ "maybe_value%1#0", @@ -3721,7 +4204,7 @@ "idx#0" ] }, - "837": { + "910": { "op": "frame_dig 2", "stack_out": [ "maybe_value%1#0", @@ -3730,14 +4213,14 @@ "idx#0" ] }, - "839": { + "912": { "op": "frame_bury 0" }, - "841": { + "914": { "retsub": true, "op": "retsub" }, - "842": { + "915": { "block": "get_operator_label_index_after_if_else@6", "stack_in": [ "maybe_value%1#0", @@ -3755,7 +4238,7 @@ "idx#0" ] }, - "844": { + "917": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -3769,7 +4252,7 @@ "1" ] }, - "845": { + "918": { "op": "+", "stack_out": [ "maybe_value%1#0", @@ -3778,7 +4261,7 @@ "idx#0" ] }, - "846": { + "919": { "op": "frame_bury 2", "defined_out": [ "idx#0" @@ -3789,10 +4272,10 @@ "idx#0" ] }, - "848": { + "921": { "op": "b get_operator_label_index_for_header@3" }, - "851": { + "924": { "block": "get_operator_label_index_after_for@8", "stack_in": [ "maybe_value%1#0", @@ -3810,14 +4293,14 @@ "4294967295" ] }, - "852": { + "925": { "op": "frame_bury 0" }, - "854": { + "927": { "retsub": true, "op": "retsub" }, - "855": { + "928": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", "params": { "operator#0": "bytes", @@ -3827,7 +4310,7 @@ "stack_in": [], "op": "proto 2 0" }, - "858": { + "931": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)" @@ -3836,18 +4319,18 @@ "label#0 (copy)" ] }, - "860": { + "933": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "op": "callsub admin_or_operator_only", "stack_out": [] }, - "863": { + "936": { "op": "frame_dig -1", "stack_out": [ "label#0 (copy)" ] }, - "865": { + "938": { "op": "box_len", "defined_out": [ "cond#0", @@ -3858,17 +4341,17 @@ "cond#0" ] }, - "866": { + "939": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "868": { + "941": { "op": "bnz add_operator_to_label_after_if_else@10", "stack_out": [] }, - "871": { + "944": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -3877,14 +4360,14 @@ "\"ERR:NOEXIST\"" ] }, - "872": { + "945": { "op": "log", "stack_out": [] }, - "873": { + "946": { "op": "err" }, - "874": { + "947": { "block": "add_operator_to_label_after_if_else@10", "stack_in": [], "op": "frame_dig -2", @@ -3895,7 +4378,7 @@ "operator#0 (copy)" ] }, - "876": { + "949": { "op": "box_len", "defined_out": [ "maybe_exists%1#0", @@ -3906,23 +4389,23 @@ "maybe_exists%1#0" ] }, - "877": { + "950": { "op": "bury 1", "stack_out": [ "maybe_exists%1#0" ] }, - "879": { + "952": { "op": "bz add_operator_to_label_else_body@2", "stack_out": [] }, - "882": { + "955": { "op": "frame_dig -2", "stack_out": [ "operator#0 (copy)" ] }, - "884": { + "957": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -3933,7 +4416,7 @@ "label#0 (copy)" ] }, - "886": { + "959": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -3943,7 +4426,7 @@ "tmp%2#0" ] }, - "889": { + "962": { "op": "intc_3 // 4294967295", "defined_out": [ "4294967295", @@ -3954,7 +4437,7 @@ "4294967295" ] }, - "890": { + "963": { "op": "==", "defined_out": [ "cond#0" @@ -3963,11 +4446,11 @@ "cond#0" ] }, - "891": { + "964": { "op": "bnz add_operator_to_label_after_if_else@6", "stack_out": [] }, - "894": { + "967": { "op": "bytec 4 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -3976,14 +4459,14 @@ "\"ERR:EXISTS\"" ] }, - "896": { + "969": { "op": "log", "stack_out": [] }, - "897": { + "970": { "op": "err" }, - "898": { + "971": { "block": "add_operator_to_label_after_if_else@6", "stack_in": [], "op": "frame_dig -2", @@ -3994,7 +4477,7 @@ "operator#0 (copy)" ] }, - "900": { + "973": { "op": "box_get", "defined_out": [ "existing#0", @@ -4005,14 +4488,14 @@ "maybe_exists%2#0" ] }, - "901": { + "974": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ "existing#0" ] }, - "902": { + "975": { "op": "frame_dig -1", "defined_out": [ "existing#0", @@ -4023,7 +4506,7 @@ "label#0 (copy)" ] }, - "904": { + "977": { "op": "len", "defined_out": [ "existing#0", @@ -4034,7 +4517,7 @@ "length%0#0" ] }, - "905": { + "978": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -4045,7 +4528,7 @@ "as_bytes%0#0" ] }, - "906": { + "979": { "op": "extract 6 2", "defined_out": [ "existing#0", @@ -4056,7 +4539,7 @@ "length_uint16%0#0" ] }, - "909": { + "982": { "op": "frame_dig -1", "stack_out": [ "existing#0", @@ -4064,7 +4547,7 @@ "label#0 (copy)" ] }, - "911": { + "984": { "op": "concat", "defined_out": [ "encoded_value%0#0", @@ -4075,7 +4558,7 @@ "encoded_value%0#0" ] }, - "912": { + "985": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -4088,21 +4571,21 @@ "1" ] }, - "913": { + "986": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ "existing#0" ] }, - "916": { + "989": { "op": "frame_dig -2", "stack_out": [ "existing#0", "operator#0 (copy)" ] }, - "918": { + "991": { "op": "box_del", "defined_out": [ "existing#0", @@ -4113,31 +4596,31 @@ "{box_del}" ] }, - "919": { + "992": { "op": "pop", "stack_out": [ "existing#0" ] }, - "920": { + "993": { "op": "frame_dig -2", "stack_out": [ "existing#0", "operator#0 (copy)" ] }, - "922": { + "995": { "op": "swap", "stack_out": [ "operator#0 (copy)", "existing#0" ] }, - "923": { + "996": { "op": "box_put", "stack_out": [] }, - "924": { + "997": { "block": "add_operator_to_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -4148,7 +4631,7 @@ "label#0 (copy)" ] }, - "926": { + "999": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -4159,14 +4642,14 @@ "maybe_exists%3#0" ] }, - "927": { + "1000": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "label_descriptor#0" ] }, - "928": { + "1001": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -4177,7 +4660,7 @@ "label_descriptor#0 (copy)" ] }, - "929": { + "1002": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -4190,7 +4673,7 @@ "10" ] }, - "931": { + "1004": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -4201,7 +4684,7 @@ "tmp%9#0" ] }, - "932": { + "1005": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -4214,7 +4697,7 @@ "1" ] }, - "933": { + "1006": { "op": "+", "defined_out": [ "label_descriptor#0", @@ -4225,7 +4708,7 @@ "to_encode%0#0" ] }, - "934": { + "1007": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -4236,20 +4719,20 @@ "val_as_bytes%0#0" ] }, - "935": { + "1008": { "op": "replace2 10", "stack_out": [ "label_descriptor#0" ] }, - "937": { + "1010": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "label#0 (copy)" ] }, - "939": { + "1012": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -4260,35 +4743,35 @@ "{box_del}" ] }, - "940": { + "1013": { "op": "pop", "stack_out": [ "label_descriptor#0" ] }, - "941": { + "1014": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "label#0 (copy)" ] }, - "943": { + "1016": { "op": "swap", "stack_out": [ "label#0 (copy)", "label_descriptor#0" ] }, - "944": { + "1017": { "op": "box_put", "stack_out": [] }, - "945": { + "1018": { "retsub": true, "op": "retsub" }, - "946": { + "1019": { "block": "add_operator_to_label_else_body@2", "stack_in": [], "op": "frame_dig -1", @@ -4299,7 +4782,7 @@ "label#0 (copy)" ] }, - "948": { + "1021": { "op": "len", "defined_out": [ "length%1#0" @@ -4308,7 +4791,7 @@ "length%1#0" ] }, - "949": { + "1022": { "op": "itob", "defined_out": [ "as_bytes%1#0" @@ -4317,7 +4800,7 @@ "as_bytes%1#0" ] }, - "950": { + "1023": { "op": "extract 6 2", "defined_out": [ "length_uint16%1#0" @@ -4326,14 +4809,14 @@ "length_uint16%1#0" ] }, - "953": { + "1026": { "op": "frame_dig -1", "stack_out": [ "length_uint16%1#0", "label#0 (copy)" ] }, - "955": { + "1028": { "op": "concat", "defined_out": [ "encoded_value%1#0" @@ -4342,7 +4825,7 @@ "encoded_value%1#0" ] }, - "956": { + "1029": { "op": "bytec 9 // 0x0002", "defined_out": [ "0x0002", @@ -4353,14 +4836,14 @@ "0x0002" ] }, - "958": { + "1031": { "op": "swap", "stack_out": [ "0x0002", "encoded_value%1#0" ] }, - "959": { + "1032": { "op": "concat", "defined_out": [ "result%1#0" @@ -4369,7 +4852,7 @@ "result%1#0" ] }, - "960": { + "1033": { "op": "bytec 10 // 0x0001", "defined_out": [ "0x0001", @@ -4380,14 +4863,14 @@ "0x0001" ] }, - "962": { + "1035": { "op": "swap", "stack_out": [ "0x0001", "result%1#0" ] }, - "963": { + "1036": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -4396,7 +4879,7 @@ "array_data%0#0" ] }, - "964": { + "1037": { "op": "frame_dig -2", "defined_out": [ "array_data%0#0", @@ -4407,7 +4890,7 @@ "operator#0 (copy)" ] }, - "966": { + "1039": { "op": "box_del", "defined_out": [ "array_data%0#0", @@ -4418,34 +4901,34 @@ "{box_del}" ] }, - "967": { + "1040": { "op": "pop", "stack_out": [ "array_data%0#0" ] }, - "968": { + "1041": { "op": "frame_dig -2", "stack_out": [ "array_data%0#0", "operator#0 (copy)" ] }, - "970": { + "1043": { "op": "swap", "stack_out": [ "operator#0 (copy)", "array_data%0#0" ] }, - "971": { + "1044": { "op": "box_put", "stack_out": [] }, - "972": { + "1045": { "op": "b add_operator_to_label_after_if_else@3" }, - "975": { + "1048": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", "params": { "operator#0": "bytes", @@ -4455,13 +4938,13 @@ "stack_in": [], "op": "proto 2 0" }, - "978": { + "1051": { "op": "intc_1 // 0", "stack_out": [ "label_descriptor#0" ] }, - "979": { + "1052": { "op": "dupn 4", "stack_out": [ "label_descriptor#0", @@ -4471,7 +4954,7 @@ "stored_label#0" ] }, - "981": { + "1054": { "op": "bytec_2 // \"\"", "stack_out": [ "label_descriptor#0", @@ -4482,7 +4965,7 @@ "array_length%0#0" ] }, - "982": { + "1055": { "op": "dupn 2", "stack_out": [ "label_descriptor#0", @@ -4495,7 +4978,7 @@ "label_idx#0" ] }, - "984": { + "1057": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)" @@ -4512,7 +4995,7 @@ "label#0 (copy)" ] }, - "986": { + "1059": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "op": "callsub admin_or_operator_only", "stack_out": [ @@ -4526,7 +5009,7 @@ "label_idx#0" ] }, - "989": { + "1062": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", @@ -4540,7 +5023,7 @@ "label#0 (copy)" ] }, - "991": { + "1064": { "op": "box_len", "defined_out": [ "cond#0", @@ -4559,7 +5042,7 @@ "cond#0" ] }, - "992": { + "1065": { "op": "bury 1", "stack_out": [ "label_descriptor#0", @@ -4573,7 +5056,7 @@ "cond#0" ] }, - "994": { + "1067": { "op": "bnz remove_operator_from_label_after_if_else@28", "stack_out": [ "label_descriptor#0", @@ -4586,7 +5069,7 @@ "label_idx#0" ] }, - "997": { + "1070": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -4603,7 +5086,7 @@ "\"ERR:NOEXIST\"" ] }, - "998": { + "1071": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -4616,10 +5099,10 @@ "label_idx#0" ] }, - "999": { + "1072": { "op": "err" }, - "1000": { + "1073": { "block": "remove_operator_from_label_after_if_else@28", "stack_in": [ "label_descriptor#0", @@ -4647,7 +5130,7 @@ "operator#0 (copy)" ] }, - "1002": { + "1075": { "op": "box_len", "defined_out": [ "cond#0", @@ -4666,7 +5149,7 @@ "cond#0" ] }, - "1003": { + "1076": { "op": "bury 1", "stack_out": [ "label_descriptor#0", @@ -4680,7 +5163,7 @@ "cond#0" ] }, - "1005": { + "1078": { "op": "bnz remove_operator_from_label_after_if_else@32", "stack_out": [ "label_descriptor#0", @@ -4693,7 +5176,7 @@ "label_idx#0" ] }, - "1008": { + "1081": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -4710,7 +5193,7 @@ "\"ERR:NOEXIST\"" ] }, - "1009": { + "1082": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -4723,10 +5206,10 @@ "label_idx#0" ] }, - "1010": { + "1083": { "op": "err" }, - "1011": { + "1084": { "block": "remove_operator_from_label_after_if_else@32", "stack_in": [ "label_descriptor#0", @@ -4754,7 +5237,7 @@ "operator#0 (copy)" ] }, - "1013": { + "1086": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -4773,7 +5256,7 @@ "label#0 (copy)" ] }, - "1015": { + "1088": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -4791,7 +5274,7 @@ "label_idx#0" ] }, - "1018": { + "1091": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -4806,7 +5289,7 @@ "label_idx#0" ] }, - "1019": { + "1092": { "op": "frame_bury 7", "defined_out": [ "label_idx#0" @@ -4823,7 +5306,7 @@ "label_idx#0" ] }, - "1021": { + "1094": { "op": "intc_3 // 4294967295", "defined_out": [ "4294967295", @@ -4842,7 +5325,7 @@ "4294967295" ] }, - "1022": { + "1095": { "op": "!=", "defined_out": [ "label_idx#0", @@ -4860,7 +5343,7 @@ "tmp%2#0" ] }, - "1023": { + "1096": { "op": "bz remove_operator_from_label_bool_false@3", "stack_out": [ "label_descriptor#0", @@ -4873,7 +5356,7 @@ "label_idx#0" ] }, - "1026": { + "1099": { "op": "frame_dig 7", "stack_out": [ "label_descriptor#0", @@ -4887,7 +5370,7 @@ "label_idx#0" ] }, - "1028": { + "1101": { "op": "intc 4 // 4294967296", "defined_out": [ "4294967296", @@ -4906,7 +5389,7 @@ "4294967296" ] }, - "1030": { + "1103": { "op": "!=", "defined_out": [ "label_idx#0", @@ -4924,7 +5407,7 @@ "tmp%3#0" ] }, - "1031": { + "1104": { "op": "bz remove_operator_from_label_bool_false@3", "stack_out": [ "label_descriptor#0", @@ -4937,7 +5420,7 @@ "label_idx#0" ] }, - "1034": { + "1107": { "op": "intc_0 // 1", "defined_out": [ "cond#0", @@ -4955,7 +5438,7 @@ "cond#0" ] }, - "1035": { + "1108": { "block": "remove_operator_from_label_bool_merge@4", "stack_in": [ "label_descriptor#0", @@ -4981,7 +5464,7 @@ "label_idx#0" ] }, - "1038": { + "1111": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -4998,7 +5481,7 @@ "\"ERR:NOEXIST\"" ] }, - "1039": { + "1112": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -5011,10 +5494,10 @@ "label_idx#0" ] }, - "1040": { + "1113": { "op": "err" }, - "1041": { + "1114": { "block": "remove_operator_from_label_after_if_else@24", "stack_in": [ "label_descriptor#0", @@ -5042,7 +5525,7 @@ "label#0 (copy)" ] }, - "1043": { + "1116": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -5061,7 +5544,7 @@ "maybe_exists%2#0" ] }, - "1044": { + "1117": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -5076,7 +5559,7 @@ "label_descriptor#0" ] }, - "1045": { + "1118": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -5092,7 +5575,7 @@ "label_descriptor#0 (copy)" ] }, - "1046": { + "1119": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -5108,7 +5591,7 @@ "label_descriptor#0" ] }, - "1048": { + "1121": { "op": "frame_bury 0", "defined_out": [ "label_descriptor#0", @@ -5127,7 +5610,7 @@ "maybe_exists%2#0" ] }, - "1050": { + "1123": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -5142,7 +5625,7 @@ "label_descriptor#0" ] }, - "1051": { + "1124": { "error": "Index access is out of bounds", "op": "extract 10 8 // on error: Index access is out of bounds", "defined_out": [ @@ -5161,7 +5644,7 @@ "reinterpret_biguint%0#0" ] }, - "1054": { + "1127": { "op": "pushbytes 0x0000000000000001", "defined_out": [ "0x0000000000000001", @@ -5181,7 +5664,7 @@ "0x0000000000000001" ] }, - "1064": { + "1137": { "op": "b>", "defined_out": [ "label_descriptor#0", @@ -5199,7 +5682,7 @@ "tmp%5#0" ] }, - "1065": { + "1138": { "op": "bnz remove_operator_from_label_bool_true@6", "stack_out": [ "label_descriptor#0", @@ -5212,7 +5695,7 @@ "label_idx#0" ] }, - "1068": { + "1141": { "op": "frame_dig 0", "stack_out": [ "label_descriptor#0", @@ -5226,7 +5709,7 @@ "label_descriptor#0" ] }, - "1070": { + "1143": { "error": "Index access is out of bounds", "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ @@ -5245,7 +5728,7 @@ "reinterpret_biguint%2#0" ] }, - "1073": { + "1146": { "op": "bytec 7 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", @@ -5265,7 +5748,7 @@ "0x0000000000000000" ] }, - "1075": { + "1148": { "op": "b==", "defined_out": [ "label_descriptor#0", @@ -5283,7 +5766,7 @@ "tmp%6#0" ] }, - "1076": { + "1149": { "op": "bz remove_operator_from_label_bool_false@7", "stack_out": [ "label_descriptor#0", @@ -5296,7 +5779,7 @@ "label_idx#0" ] }, - "1079": { + "1152": { "block": "remove_operator_from_label_bool_true@6", "stack_in": [ "label_descriptor#0", @@ -5324,7 +5807,7 @@ "cond#0" ] }, - "1080": { + "1153": { "block": "remove_operator_from_label_bool_merge@8", "stack_in": [ "label_descriptor#0", @@ -5350,7 +5833,7 @@ "label_idx#0" ] }, - "1083": { + "1156": { "op": "bytec 8 // \"ERR:NOEMPTY\"", "defined_out": [ "\"ERR:NOEMPTY\"" @@ -5367,7 +5850,7 @@ "\"ERR:NOEMPTY\"" ] }, - "1085": { + "1158": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -5380,10 +5863,10 @@ "label_idx#0" ] }, - "1086": { + "1159": { "op": "err" }, - "1087": { + "1160": { "block": "remove_operator_from_label_after_if_else@20", "stack_in": [ "label_descriptor#0", @@ -5411,7 +5894,7 @@ "label_descriptor#0" ] }, - "1089": { + "1162": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -5430,7 +5913,7 @@ "label_descriptor#0 (copy)" ] }, - "1090": { + "1163": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -5451,7 +5934,7 @@ "10" ] }, - "1092": { + "1165": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -5470,7 +5953,7 @@ "tmp%8#0" ] }, - "1093": { + "1166": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -5491,7 +5974,7 @@ "1" ] }, - "1094": { + "1167": { "op": "-", "defined_out": [ "label_descriptor#0", @@ -5510,7 +5993,7 @@ "to_encode%0#0" ] }, - "1095": { + "1168": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -5529,7 +6012,7 @@ "val_as_bytes%0#0" ] }, - "1096": { + "1169": { "op": "replace2 10", "stack_out": [ "label_descriptor#0", @@ -5543,7 +6026,7 @@ "label_descriptor#0" ] }, - "1098": { + "1171": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -5562,7 +6045,7 @@ "label#0 (copy)" ] }, - "1100": { + "1173": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -5581,7 +6064,7 @@ "{box_del}" ] }, - "1101": { + "1174": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -5595,7 +6078,7 @@ "label_descriptor#0" ] }, - "1102": { + "1175": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", @@ -5610,7 +6093,7 @@ "label#0 (copy)" ] }, - "1104": { + "1177": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -5625,7 +6108,7 @@ "label_descriptor#0" ] }, - "1105": { + "1178": { "op": "box_put", "stack_out": [ "label_descriptor#0", @@ -5638,7 +6121,7 @@ "label_idx#0" ] }, - "1106": { + "1179": { "op": "frame_dig -2", "defined_out": [ "label_descriptor#0", @@ -5656,7 +6139,7 @@ "operator#0 (copy)" ] }, - "1108": { + "1181": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -5676,7 +6159,7 @@ "maybe_exists%3#0" ] }, - "1109": { + "1182": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -5691,7 +6174,7 @@ "maybe_value%3#0" ] }, - "1110": { + "1183": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -5711,7 +6194,7 @@ "0" ] }, - "1111": { + "1184": { "op": "extract_uint16", "defined_out": [ "label_descriptor#0", @@ -5729,7 +6212,7 @@ "tmp%11#0" ] }, - "1112": { + "1185": { "op": "intc_0 // 1", "stack_out": [ "label_descriptor#0", @@ -5744,7 +6227,7 @@ "1" ] }, - "1113": { + "1186": { "op": "==", "defined_out": [ "label_descriptor#0", @@ -5762,7 +6245,7 @@ "tmp%12#0" ] }, - "1114": { + "1187": { "op": "bz remove_operator_from_label_else_body@10", "stack_out": [ "label_descriptor#0", @@ -5775,7 +6258,7 @@ "label_idx#0" ] }, - "1117": { + "1190": { "op": "frame_dig -2", "stack_out": [ "label_descriptor#0", @@ -5789,7 +6272,7 @@ "operator#0 (copy)" ] }, - "1119": { + "1192": { "op": "box_del", "stack_out": [ "label_descriptor#0", @@ -5803,7 +6286,7 @@ "{box_del}" ] }, - "1120": { + "1193": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -5816,11 +6299,11 @@ "label_idx#0" ] }, - "1121": { + "1194": { "retsub": true, "op": "retsub" }, - "1122": { + "1195": { "block": "remove_operator_from_label_else_body@10", "stack_in": [ "label_descriptor#0", @@ -5848,7 +6331,7 @@ "next_list#0" ] }, - "1124": { + "1197": { "op": "frame_bury 2", "defined_out": [ "next_list#0" @@ -5864,7 +6347,7 @@ "label_idx#0" ] }, - "1126": { + "1199": { "op": "frame_dig -2", "defined_out": [ "next_list#0", @@ -5882,7 +6365,7 @@ "operator#0 (copy)" ] }, - "1128": { + "1201": { "op": "box_get", "defined_out": [ "maybe_exists%4#0", @@ -5902,7 +6385,7 @@ "maybe_exists%4#0" ] }, - "1129": { + "1202": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -5917,7 +6400,7 @@ "maybe_value%4#0" ] }, - "1130": { + "1203": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -5933,7 +6416,7 @@ "maybe_value%4#0 (copy)" ] }, - "1131": { + "1204": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -5949,7 +6432,7 @@ "maybe_value%4#0" ] }, - "1133": { + "1206": { "op": "frame_bury 1", "defined_out": [ "maybe_exists%4#0", @@ -5969,7 +6452,7 @@ "maybe_exists%4#0" ] }, - "1135": { + "1208": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -5984,7 +6467,7 @@ "maybe_value%4#0" ] }, - "1136": { + "1209": { "op": "intc_1 // 0", "stack_out": [ "label_descriptor#0", @@ -5999,7 +6482,7 @@ "0" ] }, - "1137": { + "1210": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -6018,7 +6501,7 @@ "array_length%0#0" ] }, - "1138": { + "1211": { "op": "frame_bury 5", "defined_out": [ "array_length%0#0", @@ -6036,7 +6519,7 @@ "label_idx#0" ] }, - "1140": { + "1213": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -6056,7 +6539,7 @@ "idx#0" ] }, - "1141": { + "1214": { "op": "frame_bury 6", "defined_out": [ "array_length%0#0", @@ -6075,7 +6558,7 @@ "label_idx#0" ] }, - "1143": { + "1216": { "block": "remove_operator_from_label_for_header@11", "stack_in": [ "label_descriptor#0", @@ -6103,7 +6586,7 @@ "idx#0" ] }, - "1145": { + "1218": { "op": "frame_dig 5", "defined_out": [ "array_length%0#0", @@ -6122,7 +6605,7 @@ "array_length%0#0" ] }, - "1147": { + "1220": { "op": "<", "defined_out": [ "array_length%0#0", @@ -6141,7 +6624,7 @@ "continue_looping%0#0" ] }, - "1148": { + "1221": { "op": "bz remove_operator_from_label_after_for@16", "stack_out": [ "label_descriptor#0", @@ -6154,7 +6637,7 @@ "label_idx#0" ] }, - "1151": { + "1224": { "op": "frame_dig 1", "defined_out": [ "array_length%0#0", @@ -6173,7 +6656,7 @@ "maybe_value%4#0" ] }, - "1153": { + "1226": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -6193,7 +6676,7 @@ "array_head_and_tail%0#0" ] }, - "1156": { + "1229": { "op": "frame_dig 6", "stack_out": [ "label_descriptor#0", @@ -6208,7 +6691,7 @@ "idx#0" ] }, - "1158": { + "1231": { "op": "dup", "defined_out": [ "array_head_and_tail%0#0", @@ -6231,7 +6714,7 @@ "idx#0 (copy)" ] }, - "1159": { + "1232": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -6247,7 +6730,7 @@ "idx#0 (copy)" ] }, - "1161": { + "1234": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -6272,7 +6755,7 @@ "2" ] }, - "1162": { + "1235": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -6295,7 +6778,7 @@ "item_offset_offset%0#0" ] }, - "1163": { + "1236": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -6320,7 +6803,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1165": { + "1238": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -6337,7 +6820,7 @@ "item_offset_offset%0#0" ] }, - "1166": { + "1239": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -6360,7 +6843,7 @@ "item_offset%0#0" ] }, - "1167": { + "1240": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -6387,7 +6870,7 @@ "item_offset%0#0 (copy)" ] }, - "1168": { + "1241": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -6412,7 +6895,7 @@ "item_length%0#0" ] }, - "1169": { + "1242": { "op": "intc_2 // 2", "stack_out": [ "label_descriptor#0", @@ -6430,7 +6913,7 @@ "2" ] }, - "1170": { + "1243": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -6455,7 +6938,7 @@ "item_head_tail_length%0#0" ] }, - "1171": { + "1244": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -6476,7 +6959,7 @@ "stored_label#0" ] }, - "1172": { + "1245": { "op": "frame_bury 4", "defined_out": [ "array_length%0#0", @@ -6496,7 +6979,7 @@ "idx#0" ] }, - "1174": { + "1247": { "op": "frame_dig 7", "defined_out": [ "array_length%0#0", @@ -6518,7 +7001,7 @@ "label_idx#0" ] }, - "1176": { + "1249": { "op": "!=", "defined_out": [ "array_length%0#0", @@ -6540,7 +7023,7 @@ "tmp%15#0" ] }, - "1177": { + "1250": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -6564,7 +7047,7 @@ "next_list#9" ] }, - "1179": { + "1252": { "op": "frame_bury 3", "defined_out": [ "array_length%0#0", @@ -6587,7 +7070,7 @@ "tmp%15#0" ] }, - "1181": { + "1254": { "op": "bz remove_operator_from_label_after_if_else@14", "stack_out": [ "label_descriptor#0", @@ -6600,7 +7083,7 @@ "label_idx#0" ] }, - "1184": { + "1257": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -6623,7 +7106,7 @@ "next_list#0" ] }, - "1186": { + "1259": { "op": "frame_dig 4", "stack_out": [ "label_descriptor#0", @@ -6638,7 +7121,7 @@ "stored_label#0" ] }, - "1188": { + "1261": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -6664,7 +7147,7 @@ "1" ] }, - "1189": { + "1262": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -6679,7 +7162,7 @@ "next_list#9" ] }, - "1192": { + "1265": { "op": "frame_bury 3", "stack_out": [ "label_descriptor#0", @@ -6692,7 +7175,7 @@ "label_idx#0" ] }, - "1194": { + "1267": { "block": "remove_operator_from_label_after_if_else@14", "stack_in": [ "label_descriptor#0", @@ -6720,7 +7203,7 @@ "next_list#0" ] }, - "1196": { + "1269": { "op": "frame_bury 2", "defined_out": [ "next_list#0" @@ -6736,7 +7219,7 @@ "label_idx#0" ] }, - "1198": { + "1271": { "op": "frame_dig 6", "defined_out": [ "idx#0", @@ -6754,7 +7237,7 @@ "idx#0" ] }, - "1200": { + "1273": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -6774,7 +7257,7 @@ "1" ] }, - "1201": { + "1274": { "op": "+", "stack_out": [ "label_descriptor#0", @@ -6788,7 +7271,7 @@ "idx#0" ] }, - "1202": { + "1275": { "op": "frame_bury 6", "defined_out": [ "idx#0", @@ -6805,10 +7288,10 @@ "label_idx#0" ] }, - "1204": { + "1277": { "op": "b remove_operator_from_label_for_header@11" }, - "1207": { + "1280": { "block": "remove_operator_from_label_after_for@16", "stack_in": [ "label_descriptor#0", @@ -6836,7 +7319,7 @@ "operator#0 (copy)" ] }, - "1209": { + "1282": { "op": "box_del", "defined_out": [ "{box_del}" @@ -6853,7 +7336,7 @@ "{box_del}" ] }, - "1210": { + "1283": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -6866,7 +7349,7 @@ "label_idx#0" ] }, - "1211": { + "1284": { "op": "frame_dig -2", "stack_out": [ "label_descriptor#0", @@ -6880,7 +7363,7 @@ "operator#0 (copy)" ] }, - "1213": { + "1286": { "op": "frame_dig 2", "defined_out": [ "next_list#0", @@ -6899,7 +7382,7 @@ "next_list#0" ] }, - "1215": { + "1288": { "op": "box_put", "stack_out": [ "label_descriptor#0", @@ -6912,11 +7395,11 @@ "label_idx#0" ] }, - "1216": { + "1289": { "retsub": true, "op": "retsub" }, - "1217": { + "1290": { "block": "remove_operator_from_label_bool_false@7", "stack_in": [ "label_descriptor#0", @@ -6944,10 +7427,10 @@ "cond#0" ] }, - "1218": { + "1291": { "op": "b remove_operator_from_label_bool_merge@8" }, - "1221": { + "1294": { "block": "remove_operator_from_label_bool_false@3", "stack_in": [ "label_descriptor#0", @@ -6975,10 +7458,10 @@ "cond#0" ] }, - "1222": { + "1295": { "op": "b remove_operator_from_label_bool_merge@4" }, - "1225": { + "1298": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", "params": { "operator#0": "bytes" @@ -6987,7 +7470,7 @@ "stack_in": [], "op": "proto 1 1" }, - "1228": { + "1301": { "op": "frame_dig -1", "defined_out": [ "operator#0 (copy)" @@ -6996,7 +7479,7 @@ "operator#0 (copy)" ] }, - "1230": { + "1303": { "op": "box_len", "defined_out": [ "cond#0", @@ -7007,17 +7490,17 @@ "cond#0" ] }, - "1231": { + "1304": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "1233": { + "1306": { "op": "bnz get_operator_labels_after_if_else@3", "stack_out": [] }, - "1236": { + "1309": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -7026,14 +7509,14 @@ "\"ERR:NOEXIST\"" ] }, - "1237": { + "1310": { "op": "log", "stack_out": [] }, - "1238": { + "1311": { "op": "err" }, - "1239": { + "1312": { "block": "get_operator_labels_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -7044,7 +7527,7 @@ "operator#0 (copy)" ] }, - "1241": { + "1314": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -7055,18 +7538,18 @@ "maybe_exists%1#0" ] }, - "1242": { + "1315": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "1243": { + "1316": { "retsub": true, "op": "retsub" }, - "1244": { + "1317": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", "params": { "label#0": "bytes", @@ -7076,20 +7559,20 @@ "stack_in": [], "op": "proto 2 0" }, - "1247": { + "1320": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#1" ] }, - "1248": { + "1321": { "op": "dup", "stack_out": [ "maybe_value%1#1", "tmp%1#0" ] }, - "1249": { + "1322": { "op": "bytec_2 // \"\"", "stack_out": [ "maybe_value%1#1", @@ -7097,7 +7580,7 @@ "array_length%0#0" ] }, - "1250": { + "1323": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -7106,7 +7589,7 @@ "idx#0" ] }, - "1251": { + "1324": { "op": "frame_dig -2", "defined_out": [ "label#0 (copy)" @@ -7119,7 +7602,7 @@ "label#0 (copy)" ] }, - "1253": { + "1326": { "op": "box_len", "defined_out": [ "cond#0", @@ -7134,7 +7617,7 @@ "cond#0" ] }, - "1254": { + "1327": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -7144,7 +7627,7 @@ "cond#0" ] }, - "1256": { + "1329": { "op": "bnz add_label_to_asset_after_if_else@19", "stack_out": [ "maybe_value%1#1", @@ -7153,7 +7636,7 @@ "idx#0" ] }, - "1259": { + "1332": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -7166,7 +7649,7 @@ "\"ERR:NOEXIST\"" ] }, - "1260": { + "1333": { "op": "log", "stack_out": [ "maybe_value%1#1", @@ -7175,10 +7658,10 @@ "idx#0" ] }, - "1261": { + "1334": { "op": "err" }, - "1262": { + "1335": { "block": "add_label_to_asset_after_if_else@19", "stack_in": [ "maybe_value%1#1", @@ -7198,7 +7681,7 @@ "label#0 (copy)" ] }, - "1264": { + "1337": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [ @@ -7208,7 +7691,7 @@ "idx#0" ] }, - "1267": { + "1340": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -7221,7 +7704,7 @@ "asset#0 (copy)" ] }, - "1269": { + "1342": { "op": "itob", "defined_out": [ "tmp%1#0" @@ -7234,7 +7717,7 @@ "tmp%1#0" ] }, - "1270": { + "1343": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -7245,7 +7728,7 @@ "tmp%1#0" ] }, - "1271": { + "1344": { "op": "frame_bury 1", "defined_out": [ "tmp%1#0" @@ -7258,7 +7741,7 @@ "tmp%1#0" ] }, - "1273": { + "1346": { "op": "box_len", "defined_out": [ "maybe_exists%1#0", @@ -7274,7 +7757,7 @@ "maybe_exists%1#0" ] }, - "1274": { + "1347": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -7284,7 +7767,7 @@ "maybe_exists%1#0" ] }, - "1276": { + "1349": { "op": "bz add_label_to_asset_else_body@2", "stack_out": [ "maybe_value%1#1", @@ -7293,7 +7776,7 @@ "idx#0" ] }, - "1279": { + "1352": { "op": "frame_dig 1", "stack_out": [ "maybe_value%1#1", @@ -7303,7 +7786,7 @@ "tmp%1#0" ] }, - "1281": { + "1354": { "op": "box_len", "defined_out": [ "maybe_exists%0#1", @@ -7319,7 +7802,7 @@ "maybe_exists%0#1" ] }, - "1282": { + "1355": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -7329,7 +7812,7 @@ "maybe_exists%0#1" ] }, - "1284": { + "1357": { "op": "bnz add_label_to_asset_after_if_else@6", "stack_out": [ "maybe_value%1#1", @@ -7338,7 +7821,7 @@ "idx#0" ] }, - "1287": { + "1360": { "op": "intc 4 // 4294967296", "defined_out": [ "tmp%1#0", @@ -7352,7 +7835,7 @@ "tmp%3#0" ] }, - "1289": { + "1362": { "block": "add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12", "stack_in": [ "maybe_value%1#1", @@ -7375,7 +7858,7 @@ "4294967295" ] }, - "1290": { + "1363": { "op": "==", "defined_out": [ "cond#0" @@ -7388,7 +7871,7 @@ "cond#0" ] }, - "1291": { + "1364": { "op": "bnz add_label_to_asset_after_if_else@15", "stack_out": [ "maybe_value%1#1", @@ -7397,7 +7880,7 @@ "idx#0" ] }, - "1294": { + "1367": { "op": "bytec 4 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -7410,7 +7893,7 @@ "\"ERR:EXISTS\"" ] }, - "1296": { + "1369": { "op": "log", "stack_out": [ "maybe_value%1#1", @@ -7419,10 +7902,10 @@ "idx#0" ] }, - "1297": { + "1370": { "op": "err" }, - "1298": { + "1371": { "block": "add_label_to_asset_after_if_else@15", "stack_in": [ "maybe_value%1#1", @@ -7442,7 +7925,7 @@ "tmp%1#0" ] }, - "1300": { + "1373": { "op": "dup", "defined_out": [ "tmp%1#0", @@ -7457,7 +7940,7 @@ "tmp%1#0 (copy)" ] }, - "1301": { + "1374": { "op": "box_get", "defined_out": [ "existing#0", @@ -7474,7 +7957,7 @@ "maybe_exists%2#0" ] }, - "1302": { + "1375": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -7486,7 +7969,7 @@ "existing#0" ] }, - "1303": { + "1376": { "op": "frame_dig -2", "defined_out": [ "existing#0", @@ -7503,7 +7986,7 @@ "label#0 (copy)" ] }, - "1305": { + "1378": { "op": "len", "defined_out": [ "existing#0", @@ -7520,7 +8003,7 @@ "length%0#0" ] }, - "1306": { + "1379": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -7537,7 +8020,7 @@ "as_bytes%0#0" ] }, - "1307": { + "1380": { "op": "extract 6 2", "defined_out": [ "existing#0", @@ -7554,7 +8037,7 @@ "length_uint16%0#0" ] }, - "1310": { + "1383": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -7567,7 +8050,7 @@ "label#0 (copy)" ] }, - "1312": { + "1385": { "op": "concat", "defined_out": [ "encoded_value%0#0", @@ -7584,7 +8067,7 @@ "encoded_value%0#0" ] }, - "1313": { + "1386": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -7603,7 +8086,7 @@ "1" ] }, - "1314": { + "1387": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -7615,7 +8098,7 @@ "existing#0" ] }, - "1317": { + "1390": { "op": "dig 1", "stack_out": [ "maybe_value%1#1", @@ -7627,7 +8110,7 @@ "tmp%1#0 (copy)" ] }, - "1319": { + "1392": { "op": "box_del", "defined_out": [ "existing#0", @@ -7644,7 +8127,7 @@ "{box_del}" ] }, - "1320": { + "1393": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -7655,7 +8138,7 @@ "existing#0" ] }, - "1321": { + "1394": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -7664,7 +8147,7 @@ "idx#0" ] }, - "1322": { + "1395": { "block": "add_label_to_asset_after_if_else@3", "stack_in": [ "maybe_value%1#1", @@ -7684,7 +8167,7 @@ "label#0 (copy)" ] }, - "1324": { + "1397": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -7699,7 +8182,7 @@ "maybe_exists%3#0" ] }, - "1325": { + "1398": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -7710,7 +8193,7 @@ "label_descriptor#0" ] }, - "1326": { + "1399": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -7725,7 +8208,7 @@ "label_descriptor#0 (copy)" ] }, - "1327": { + "1400": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -7742,7 +8225,7 @@ "2" ] }, - "1328": { + "1401": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -7757,7 +8240,7 @@ "tmp%13#0" ] }, - "1329": { + "1402": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -7774,7 +8257,7 @@ "1" ] }, - "1330": { + "1403": { "op": "+", "defined_out": [ "label_descriptor#0", @@ -7789,7 +8272,7 @@ "to_encode%0#0" ] }, - "1331": { + "1404": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -7804,7 +8287,7 @@ "val_as_bytes%0#0" ] }, - "1332": { + "1405": { "op": "replace2 2", "stack_out": [ "maybe_value%1#1", @@ -7814,7 +8297,7 @@ "label_descriptor#0" ] }, - "1334": { + "1407": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -7825,7 +8308,7 @@ "label#0 (copy)" ] }, - "1336": { + "1409": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -7840,7 +8323,7 @@ "{box_del}" ] }, - "1337": { + "1410": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -7850,7 +8333,7 @@ "label_descriptor#0" ] }, - "1338": { + "1411": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -7861,7 +8344,7 @@ "label#0 (copy)" ] }, - "1340": { + "1413": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -7872,7 +8355,7 @@ "label_descriptor#0" ] }, - "1341": { + "1414": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -7881,11 +8364,11 @@ "idx#0" ] }, - "1342": { + "1415": { "retsub": true, "op": "retsub" }, - "1343": { + "1416": { "block": "add_label_to_asset_after_if_else@6", "stack_in": [ "maybe_value%1#1", @@ -7905,7 +8388,7 @@ "tmp%1#0" ] }, - "1345": { + "1418": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -7921,7 +8404,7 @@ "maybe_exists%1#0" ] }, - "1346": { + "1419": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -7932,7 +8415,7 @@ "maybe_value%1#1" ] }, - "1347": { + "1420": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -7944,7 +8427,7 @@ "maybe_value%1#1 (copy)" ] }, - "1348": { + "1421": { "op": "cover 2", "stack_out": [ "maybe_value%1#1", @@ -7956,7 +8439,7 @@ "maybe_value%1#1" ] }, - "1350": { + "1423": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%1#0", @@ -7972,7 +8455,7 @@ "maybe_exists%1#0" ] }, - "1352": { + "1425": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -7983,7 +8466,7 @@ "maybe_value%1#1" ] }, - "1353": { + "1426": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -7999,7 +8482,7 @@ "0" ] }, - "1354": { + "1427": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -8014,7 +8497,7 @@ "array_length%0#0" ] }, - "1355": { + "1428": { "op": "frame_bury 2", "defined_out": [ "array_length%0#0", @@ -8028,7 +8511,7 @@ "idx#0" ] }, - "1357": { + "1430": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -8044,7 +8527,7 @@ "idx#0" ] }, - "1358": { + "1431": { "op": "frame_bury 3", "defined_out": [ "array_length%0#0", @@ -8059,7 +8542,7 @@ "idx#0" ] }, - "1360": { + "1433": { "block": "add_label_to_asset_for_header@7", "stack_in": [ "maybe_value%1#1", @@ -8079,7 +8562,7 @@ "idx#0" ] }, - "1362": { + "1435": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -8094,7 +8577,7 @@ "array_length%0#0" ] }, - "1364": { + "1437": { "op": "<", "defined_out": [ "array_length%0#0", @@ -8109,7 +8592,7 @@ "continue_looping%0#0" ] }, - "1365": { + "1438": { "op": "bz add_label_to_asset_after_for@11", "stack_out": [ "maybe_value%1#1", @@ -8118,7 +8601,7 @@ "idx#0" ] }, - "1368": { + "1441": { "op": "frame_dig 0", "defined_out": [ "array_length%0#0", @@ -8133,7 +8616,7 @@ "maybe_value%1#1" ] }, - "1370": { + "1443": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -8149,7 +8632,7 @@ "array_head_and_tail%0#0" ] }, - "1373": { + "1446": { "op": "frame_dig 3", "stack_out": [ "maybe_value%1#1", @@ -8160,7 +8643,7 @@ "idx#0" ] }, - "1375": { + "1448": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -8179,7 +8662,7 @@ "2" ] }, - "1376": { + "1449": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -8197,7 +8680,7 @@ "item_offset_offset%0#0" ] }, - "1377": { + "1450": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -8217,7 +8700,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1379": { + "1452": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -8229,7 +8712,7 @@ "item_offset_offset%0#0" ] }, - "1380": { + "1453": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -8247,7 +8730,7 @@ "item_offset%0#0" ] }, - "1381": { + "1454": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -8269,7 +8752,7 @@ "item_offset%0#0 (copy)" ] }, - "1382": { + "1455": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -8289,7 +8772,7 @@ "item_length%0#0" ] }, - "1383": { + "1456": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%1#1", @@ -8302,7 +8785,7 @@ "2" ] }, - "1384": { + "1457": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -8322,7 +8805,7 @@ "item_head_tail_length%0#0" ] }, - "1385": { + "1458": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -8338,7 +8821,7 @@ "stored_label#0" ] }, - "1386": { + "1459": { "op": "extract 2 0", "defined_out": [ "array_length%0#0", @@ -8354,7 +8837,7 @@ "tmp%4#1" ] }, - "1389": { + "1462": { "op": "frame_dig -2", "defined_out": [ "array_length%0#0", @@ -8372,7 +8855,7 @@ "label#0 (copy)" ] }, - "1391": { + "1464": { "op": "==", "defined_out": [ "array_length%0#0", @@ -8388,7 +8871,7 @@ "tmp%5#1" ] }, - "1392": { + "1465": { "op": "bz add_label_to_asset_after_if_else@10", "stack_out": [ "maybe_value%1#1", @@ -8397,7 +8880,7 @@ "idx#0" ] }, - "1395": { + "1468": { "op": "frame_dig 3", "defined_out": [ "array_length%0#0", @@ -8413,10 +8896,10 @@ "tmp%3#0" ] }, - "1397": { + "1470": { "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" }, - "1400": { + "1473": { "block": "add_label_to_asset_after_if_else@10", "stack_in": [ "maybe_value%1#1", @@ -8436,7 +8919,7 @@ "idx#0" ] }, - "1402": { + "1475": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -8451,7 +8934,7 @@ "1" ] }, - "1403": { + "1476": { "op": "+", "stack_out": [ "maybe_value%1#1", @@ -8461,7 +8944,7 @@ "idx#0" ] }, - "1404": { + "1477": { "op": "frame_bury 3", "defined_out": [ "idx#0" @@ -8473,10 +8956,10 @@ "idx#0" ] }, - "1406": { + "1479": { "op": "b add_label_to_asset_for_header@7" }, - "1409": { + "1482": { "block": "add_label_to_asset_after_for@11", "stack_in": [ "maybe_value%1#1", @@ -8496,10 +8979,10 @@ "tmp%3#0" ] }, - "1410": { + "1483": { "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" }, - "1413": { + "1486": { "block": "add_label_to_asset_else_body@2", "stack_in": [ "maybe_value%1#1", @@ -8519,7 +9002,7 @@ "label#0 (copy)" ] }, - "1415": { + "1488": { "op": "len", "defined_out": [ "length%1#0" @@ -8532,7 +9015,7 @@ "length%1#0" ] }, - "1416": { + "1489": { "op": "itob", "defined_out": [ "as_bytes%1#0" @@ -8545,7 +9028,7 @@ "as_bytes%1#0" ] }, - "1417": { + "1490": { "op": "extract 6 2", "defined_out": [ "length_uint16%1#0" @@ -8558,7 +9041,7 @@ "length_uint16%1#0" ] }, - "1420": { + "1493": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -8569,7 +9052,7 @@ "label#0 (copy)" ] }, - "1422": { + "1495": { "op": "concat", "defined_out": [ "encoded_value%1#0" @@ -8582,7 +9065,7 @@ "encoded_value%1#0" ] }, - "1423": { + "1496": { "op": "bytec 9 // 0x0002", "defined_out": [ "0x0002", @@ -8597,7 +9080,7 @@ "0x0002" ] }, - "1425": { + "1498": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -8608,7 +9091,7 @@ "encoded_value%1#0" ] }, - "1426": { + "1499": { "op": "concat", "defined_out": [ "result%1#0" @@ -8621,7 +9104,7 @@ "result%1#0" ] }, - "1427": { + "1500": { "op": "bytec 10 // 0x0001", "defined_out": [ "0x0001", @@ -8636,7 +9119,7 @@ "0x0001" ] }, - "1429": { + "1502": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -8647,7 +9130,7 @@ "result%1#0" ] }, - "1430": { + "1503": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -8660,7 +9143,7 @@ "array_data%0#0" ] }, - "1431": { + "1504": { "op": "frame_dig 1", "defined_out": [ "array_data%0#0", @@ -8675,7 +9158,7 @@ "tmp%1#0" ] }, - "1433": { + "1506": { "op": "dup", "defined_out": [ "array_data%0#0", @@ -8692,7 +9175,7 @@ "tmp%1#0 (copy)" ] }, - "1434": { + "1507": { "op": "box_del", "defined_out": [ "array_data%0#0", @@ -8709,7 +9192,7 @@ "{box_del}" ] }, - "1435": { + "1508": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -8720,7 +9203,7 @@ "tmp%1#0" ] }, - "1436": { + "1509": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -8731,7 +9214,7 @@ "array_data%0#0" ] }, - "1437": { + "1510": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -8740,10 +9223,10 @@ "idx#0" ] }, - "1438": { + "1511": { "op": "b add_label_to_asset_after_if_else@3" }, - "1441": { + "1514": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", "params": { "label#0": "bytes", @@ -8753,13 +9236,13 @@ "stack_in": [], "op": "proto 2 0" }, - "1444": { + "1517": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0" ] }, - "1445": { + "1518": { "op": "dupn 3", "stack_out": [ "maybe_value%3#0", @@ -8768,7 +9251,7 @@ "tmp%1#0" ] }, - "1447": { + "1520": { "op": "bytec_2 // \"\"", "stack_out": [ "maybe_value%3#0", @@ -8778,7 +9261,7 @@ "array_length%1#0" ] }, - "1448": { + "1521": { "op": "dupn 2", "stack_out": [ "maybe_value%3#0", @@ -8790,7 +9273,7 @@ "idx#0" ] }, - "1450": { + "1523": { "op": "frame_dig -2", "defined_out": [ "label#0 (copy)" @@ -8806,7 +9289,7 @@ "label#0 (copy)" ] }, - "1452": { + "1525": { "op": "box_len", "defined_out": [ "cond#1", @@ -8824,7 +9307,7 @@ "cond#1" ] }, - "1453": { + "1526": { "op": "bury 1", "stack_out": [ "maybe_value%3#0", @@ -8837,7 +9320,7 @@ "cond#1" ] }, - "1455": { + "1528": { "op": "bnz remove_label_from_asset_after_if_else@20", "stack_out": [ "maybe_value%3#0", @@ -8849,7 +9332,7 @@ "idx#0" ] }, - "1458": { + "1531": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -8865,7 +9348,7 @@ "\"ERR:NOEXIST\"" ] }, - "1459": { + "1532": { "op": "log", "stack_out": [ "maybe_value%3#0", @@ -8877,10 +9360,10 @@ "idx#0" ] }, - "1460": { + "1533": { "op": "err" }, - "1461": { + "1534": { "block": "remove_label_from_asset_after_if_else@20", "stack_in": [ "maybe_value%3#0", @@ -8906,7 +9389,7 @@ "label#0 (copy)" ] }, - "1463": { + "1536": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [ @@ -8919,7 +9402,7 @@ "idx#0" ] }, - "1466": { + "1539": { "op": "intc_1 // 0", "defined_out": [ "found#0" @@ -8935,7 +9418,7 @@ "found#0" ] }, - "1467": { + "1540": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -8950,7 +9433,7 @@ "idx#0" ] }, - "1469": { + "1542": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)", @@ -8967,7 +9450,7 @@ "asset#0 (copy)" ] }, - "1471": { + "1544": { "op": "itob", "defined_out": [ "found#0", @@ -8984,7 +9467,7 @@ "tmp%1#0" ] }, - "1472": { + "1545": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -8998,7 +9481,7 @@ "tmp%1#0" ] }, - "1473": { + "1546": { "op": "frame_bury 3", "defined_out": [ "found#0", @@ -9015,7 +9498,7 @@ "tmp%1#0" ] }, - "1475": { + "1548": { "op": "box_get", "defined_out": [ "found#0", @@ -9035,7 +9518,7 @@ "maybe_exists%1#0" ] }, - "1476": { + "1549": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -9049,7 +9532,7 @@ "maybe_value%1#0" ] }, - "1477": { + "1550": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -9063,7 +9546,7 @@ "0" ] }, - "1478": { + "1551": { "op": "extract_uint16", "defined_out": [ "found#0", @@ -9081,7 +9564,7 @@ "tmp%3#0" ] }, - "1479": { + "1552": { "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", @@ -9095,7 +9578,7 @@ "1" ] }, - "1480": { + "1553": { "op": "==", "defined_out": [ "found#0", @@ -9113,7 +9596,7 @@ "tmp%4#0" ] }, - "1481": { + "1554": { "op": "bz remove_label_from_asset_else_body@5", "stack_out": [ "maybe_value%3#0", @@ -9125,7 +9608,7 @@ "idx#0" ] }, - "1484": { + "1557": { "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", @@ -9138,7 +9621,7 @@ "tmp%1#0" ] }, - "1486": { + "1559": { "op": "box_get", "defined_out": [ "found#0", @@ -9158,7 +9641,7 @@ "maybe_exists%2#0" ] }, - "1487": { + "1560": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -9172,7 +9655,7 @@ "maybe_value%2#0" ] }, - "1488": { + "1561": { "op": "dup", "defined_out": [ "found#0", @@ -9192,7 +9675,7 @@ "maybe_value%2#0 (copy)" ] }, - "1489": { + "1562": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -9212,7 +9695,7 @@ "array_head_and_tail%0#0" ] }, - "1492": { + "1565": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -9226,7 +9709,7 @@ "maybe_value%2#0" ] }, - "1493": { + "1566": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -9241,7 +9724,7 @@ "0" ] }, - "1494": { + "1567": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -9261,7 +9744,7 @@ "array_length%0#0" ] }, - "1495": { + "1568": { "error": "Index access is out of bounds", "op": "assert // Index access is out of bounds", "stack_out": [ @@ -9275,7 +9758,7 @@ "array_head_and_tail%0#0" ] }, - "1496": { + "1569": { "op": "dup", "defined_out": [ "array_head_and_tail%0#0", @@ -9295,7 +9778,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1497": { + "1570": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -9310,7 +9793,7 @@ "0" ] }, - "1498": { + "1571": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -9330,7 +9813,7 @@ "item_offset%0#0" ] }, - "1499": { + "1572": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -9354,7 +9837,7 @@ "item_offset%0#0 (copy)" ] }, - "1500": { + "1573": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -9376,7 +9859,7 @@ "item_length%0#0" ] }, - "1501": { + "1574": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -9400,7 +9883,7 @@ "2" ] }, - "1502": { + "1575": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -9422,7 +9905,7 @@ "item_head_tail_length%0#0" ] }, - "1503": { + "1576": { "op": "extract3", "defined_out": [ "found#0", @@ -9440,7 +9923,7 @@ "tmp%7#0" ] }, - "1504": { + "1577": { "op": "extract 2 0", "defined_out": [ "found#0", @@ -9458,7 +9941,7 @@ "tmp%8#0" ] }, - "1507": { + "1580": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -9472,7 +9955,7 @@ "label#0 (copy)" ] }, - "1509": { + "1582": { "op": "==", "defined_out": [ "found#0", @@ -9490,7 +9973,7 @@ "tmp%9#0" ] }, - "1510": { + "1583": { "op": "bz remove_label_from_asset_else_body@3", "stack_out": [ "maybe_value%3#0", @@ -9502,7 +9985,7 @@ "idx#0" ] }, - "1513": { + "1586": { "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", @@ -9515,7 +9998,7 @@ "tmp%1#0" ] }, - "1515": { + "1588": { "op": "box_del", "defined_out": [ "found#0", @@ -9533,7 +10016,7 @@ "{box_del}" ] }, - "1516": { + "1589": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -9545,7 +10028,7 @@ "idx#0" ] }, - "1517": { + "1590": { "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", @@ -9558,7 +10041,7 @@ "found#0" ] }, - "1518": { + "1591": { "op": "frame_bury 5", "stack_out": [ "maybe_value%3#0", @@ -9570,7 +10053,7 @@ "idx#0" ] }, - "1520": { + "1593": { "block": "remove_label_from_asset_after_if_else@13", "stack_in": [ "maybe_value%3#0", @@ -9596,7 +10079,7 @@ "found#0" ] }, - "1522": { + "1595": { "op": "bnz remove_label_from_asset_after_if_else@16", "stack_out": [ "maybe_value%3#0", @@ -9608,7 +10091,7 @@ "idx#0" ] }, - "1525": { + "1598": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"", @@ -9625,7 +10108,7 @@ "\"ERR:NOEXIST\"" ] }, - "1526": { + "1599": { "op": "log", "stack_out": [ "maybe_value%3#0", @@ -9637,10 +10120,10 @@ "idx#0" ] }, - "1527": { + "1600": { "op": "err" }, - "1528": { + "1601": { "block": "remove_label_from_asset_after_if_else@16", "stack_in": [ "maybe_value%3#0", @@ -9666,7 +10149,7 @@ "label#0 (copy)" ] }, - "1530": { + "1603": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -9684,7 +10167,7 @@ "maybe_exists%4#0" ] }, - "1531": { + "1604": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -9698,7 +10181,7 @@ "label_descriptor#0" ] }, - "1532": { + "1605": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -9716,7 +10199,7 @@ "label_descriptor#0 (copy)" ] }, - "1533": { + "1606": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -9736,7 +10219,7 @@ "2" ] }, - "1534": { + "1607": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -9754,7 +10237,7 @@ "tmp%20#0" ] }, - "1535": { + "1608": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -9774,7 +10257,7 @@ "1" ] }, - "1536": { + "1609": { "op": "-", "defined_out": [ "label_descriptor#0", @@ -9792,7 +10275,7 @@ "to_encode%0#0" ] }, - "1537": { + "1610": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -9810,7 +10293,7 @@ "val_as_bytes%0#0" ] }, - "1538": { + "1611": { "op": "replace2 2", "stack_out": [ "maybe_value%3#0", @@ -9823,7 +10306,7 @@ "label_descriptor#0" ] }, - "1540": { + "1613": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -9837,7 +10320,7 @@ "label#0 (copy)" ] }, - "1542": { + "1615": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -9855,7 +10338,7 @@ "{box_del}" ] }, - "1543": { + "1616": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -9868,7 +10351,7 @@ "label_descriptor#0" ] }, - "1544": { + "1617": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -9882,7 +10365,7 @@ "label#0 (copy)" ] }, - "1546": { + "1619": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -9896,7 +10379,7 @@ "label_descriptor#0" ] }, - "1547": { + "1620": { "op": "box_put", "stack_out": [ "maybe_value%3#0", @@ -9908,11 +10391,11 @@ "idx#0" ] }, - "1548": { + "1621": { "retsub": true, "op": "retsub" }, - "1549": { + "1622": { "block": "remove_label_from_asset_else_body@3", "stack_in": [ "maybe_value%3#0", @@ -9938,7 +10421,7 @@ "found#0" ] }, - "1550": { + "1623": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -9953,10 +10436,10 @@ "idx#0" ] }, - "1552": { + "1625": { "op": "b remove_label_from_asset_after_if_else@13" }, - "1555": { + "1628": { "block": "remove_label_from_asset_else_body@5", "stack_in": [ "maybe_value%3#0", @@ -9982,7 +10465,7 @@ "next_list#0" ] }, - "1557": { + "1630": { "op": "frame_bury 1", "defined_out": [ "next_list#0" @@ -9997,7 +10480,7 @@ "idx#0" ] }, - "1559": { + "1632": { "op": "frame_dig 3", "defined_out": [ "next_list#0", @@ -10014,7 +10497,7 @@ "tmp%1#0" ] }, - "1561": { + "1634": { "op": "box_get", "defined_out": [ "maybe_exists%3#0", @@ -10034,7 +10517,7 @@ "maybe_exists%3#0" ] }, - "1562": { + "1635": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -10048,7 +10531,7 @@ "maybe_value%3#0" ] }, - "1563": { + "1636": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -10063,7 +10546,7 @@ "maybe_value%3#0 (copy)" ] }, - "1564": { + "1637": { "op": "cover 2", "stack_out": [ "maybe_value%3#0", @@ -10078,7 +10561,7 @@ "maybe_value%3#0" ] }, - "1566": { + "1639": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%3#0", @@ -10098,7 +10581,7 @@ "maybe_exists%3#0" ] }, - "1568": { + "1641": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -10112,7 +10595,7 @@ "maybe_value%3#0" ] }, - "1569": { + "1642": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -10126,7 +10609,7 @@ "0" ] }, - "1570": { + "1643": { "op": "extract_uint16", "defined_out": [ "array_length%1#0", @@ -10145,7 +10628,7 @@ "array_length%1#0" ] }, - "1571": { + "1644": { "op": "frame_bury 4", "defined_out": [ "array_length%1#0", @@ -10163,7 +10646,7 @@ "idx#0" ] }, - "1573": { + "1646": { "op": "intc_1 // 0", "defined_out": [ "array_length%1#0", @@ -10183,7 +10666,7 @@ "idx#0" ] }, - "1574": { + "1647": { "op": "frame_bury 6", "defined_out": [ "array_length%1#0", @@ -10202,7 +10685,7 @@ "idx#0" ] }, - "1576": { + "1649": { "block": "remove_label_from_asset_for_header@6", "stack_in": [ "maybe_value%3#0", @@ -10228,7 +10711,7 @@ "idx#0" ] }, - "1578": { + "1651": { "op": "frame_dig 4", "defined_out": [ "array_length%1#0", @@ -10246,7 +10729,7 @@ "array_length%1#0" ] }, - "1580": { + "1653": { "op": "<", "defined_out": [ "array_length%1#0", @@ -10264,7 +10747,7 @@ "continue_looping%0#0" ] }, - "1581": { + "1654": { "op": "bz remove_label_from_asset_after_for@12", "stack_out": [ "maybe_value%3#0", @@ -10276,7 +10759,7 @@ "idx#0" ] }, - "1584": { + "1657": { "op": "frame_dig 0", "defined_out": [ "array_length%1#0", @@ -10294,7 +10777,7 @@ "maybe_value%3#0" ] }, - "1586": { + "1659": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%1#0", @@ -10313,7 +10796,7 @@ "array_head_and_tail%1#0" ] }, - "1589": { + "1662": { "op": "frame_dig 6", "stack_out": [ "maybe_value%3#0", @@ -10327,7 +10810,7 @@ "idx#0" ] }, - "1591": { + "1664": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -10349,7 +10832,7 @@ "2" ] }, - "1592": { + "1665": { "op": "*", "defined_out": [ "array_head_and_tail%1#0", @@ -10370,7 +10853,7 @@ "item_offset_offset%1#0" ] }, - "1593": { + "1666": { "op": "dig 1", "defined_out": [ "array_head_and_tail%1#0", @@ -10393,7 +10876,7 @@ "array_head_and_tail%1#0 (copy)" ] }, - "1595": { + "1668": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -10408,7 +10891,7 @@ "item_offset_offset%1#0" ] }, - "1596": { + "1669": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%1#0", @@ -10429,7 +10912,7 @@ "item_offset%1#0" ] }, - "1597": { + "1670": { "op": "dup2", "defined_out": [ "array_head_and_tail%1#0", @@ -10454,7 +10937,7 @@ "item_offset%1#0 (copy)" ] }, - "1598": { + "1671": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%1#0", @@ -10477,7 +10960,7 @@ "item_length%1#0" ] }, - "1599": { + "1672": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%3#0", @@ -10493,7 +10976,7 @@ "2" ] }, - "1600": { + "1673": { "op": "+", "defined_out": [ "array_head_and_tail%1#0", @@ -10516,7 +10999,7 @@ "item_head_tail_length%1#0" ] }, - "1601": { + "1674": { "op": "extract3", "defined_out": [ "array_length%1#0", @@ -10535,7 +11018,7 @@ "stored_label#0" ] }, - "1602": { + "1675": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -10549,7 +11032,7 @@ "stored_label#0" ] }, - "1603": { + "1676": { "op": "frame_bury 2", "defined_out": [ "array_length%1#0", @@ -10568,7 +11051,7 @@ "stored_label#0" ] }, - "1605": { + "1678": { "op": "extract 2 0", "defined_out": [ "array_length%1#0", @@ -10588,7 +11071,7 @@ "tmp%14#0" ] }, - "1608": { + "1681": { "op": "frame_dig -2", "defined_out": [ "array_length%1#0", @@ -10610,7 +11093,7 @@ "label#0 (copy)" ] }, - "1610": { + "1683": { "op": "!=", "defined_out": [ "array_length%1#0", @@ -10630,7 +11113,7 @@ "tmp%15#0" ] }, - "1611": { + "1684": { "op": "bz remove_label_from_asset_else_body@9", "stack_out": [ "maybe_value%3#0", @@ -10642,7 +11125,7 @@ "idx#0" ] }, - "1614": { + "1687": { "op": "frame_dig 1", "defined_out": [ "array_length%1#0", @@ -10662,7 +11145,7 @@ "next_list#0" ] }, - "1616": { + "1689": { "op": "frame_dig 2", "stack_out": [ "maybe_value%3#0", @@ -10676,7 +11159,7 @@ "stored_label#0" ] }, - "1618": { + "1691": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -10699,7 +11182,7 @@ "1" ] }, - "1619": { + "1692": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -10713,7 +11196,7 @@ "next_list#0" ] }, - "1622": { + "1695": { "op": "frame_bury 1", "defined_out": [ "array_length%1#0", @@ -10732,7 +11215,7 @@ "idx#0" ] }, - "1624": { + "1697": { "block": "remove_label_from_asset_after_if_else@10", "stack_in": [ "maybe_value%3#0", @@ -10758,7 +11241,7 @@ "idx#0" ] }, - "1626": { + "1699": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -10776,7 +11259,7 @@ "1" ] }, - "1627": { + "1700": { "op": "+", "stack_out": [ "maybe_value%3#0", @@ -10789,7 +11272,7 @@ "idx#0" ] }, - "1628": { + "1701": { "op": "frame_bury 6", "defined_out": [ "idx#0" @@ -10804,10 +11287,10 @@ "idx#0" ] }, - "1630": { + "1703": { "op": "b remove_label_from_asset_for_header@6" }, - "1633": { + "1706": { "block": "remove_label_from_asset_else_body@9", "stack_in": [ "maybe_value%3#0", @@ -10833,7 +11316,7 @@ "found#0" ] }, - "1634": { + "1707": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -10848,10 +11331,10 @@ "idx#0" ] }, - "1636": { + "1709": { "op": "b remove_label_from_asset_after_if_else@10" }, - "1639": { + "1712": { "block": "remove_label_from_asset_after_for@12", "stack_in": [ "maybe_value%3#0", @@ -10877,7 +11360,7 @@ "tmp%1#0" ] }, - "1641": { + "1714": { "op": "dup", "defined_out": [ "tmp%1#0", @@ -10895,7 +11378,7 @@ "tmp%1#0 (copy)" ] }, - "1642": { + "1715": { "op": "box_del", "defined_out": [ "tmp%1#0", @@ -10913,7 +11396,7 @@ "{box_del}" ] }, - "1643": { + "1716": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -10926,7 +11409,7 @@ "tmp%1#0" ] }, - "1644": { + "1717": { "op": "frame_dig 1", "defined_out": [ "next_list#0", @@ -10944,7 +11427,7 @@ "next_list#0" ] }, - "1646": { + "1719": { "op": "box_put", "stack_out": [ "maybe_value%3#0", @@ -10956,10 +11439,10 @@ "idx#0" ] }, - "1647": { + "1720": { "op": "b remove_label_from_asset_after_if_else@13" }, - "1650": { + "1723": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", "params": { "asset#0": "uint64" @@ -10968,7 +11451,7 @@ "stack_in": [], "op": "proto 1 1" }, - "1653": { + "1726": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -10977,7 +11460,7 @@ "asset#0 (copy)" ] }, - "1655": { + "1728": { "op": "itob", "defined_out": [ "tmp%0#0" @@ -10986,7 +11469,7 @@ "tmp%0#0" ] }, - "1656": { + "1729": { "op": "dup", "defined_out": [ "tmp%0#0" @@ -10996,7 +11479,7 @@ "tmp%0#0" ] }, - "1657": { + "1730": { "op": "box_len", "defined_out": [ "cond#0", @@ -11009,20 +11492,20 @@ "cond#0" ] }, - "1658": { + "1731": { "op": "bury 1", "stack_out": [ "tmp%0#0", "cond#0" ] }, - "1660": { + "1733": { "op": "bnz get_asset_labels_after_if_else@3", "stack_out": [ "tmp%0#0" ] }, - "1663": { + "1736": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"", @@ -11033,16 +11516,16 @@ "\"ERR:NOEXIST\"" ] }, - "1664": { + "1737": { "op": "log", "stack_out": [ "tmp%0#0" ] }, - "1665": { + "1738": { "op": "err" }, - "1666": { + "1739": { "block": "get_asset_labels_after_if_else@3", "stack_in": [ "tmp%0#0" @@ -11056,7 +11539,7 @@ "tmp%0#0" ] }, - "1668": { + "1741": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -11069,7 +11552,7 @@ "maybe_exists%1#0" ] }, - "1669": { + "1742": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -11077,10 +11560,10 @@ "maybe_value%1#0" ] }, - "1670": { + "1743": { "op": "swap" }, - "1671": { + "1744": { "retsub": true, "op": "retsub" } diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal index 3b2ae91..739e335 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal @@ -17,19 +17,19 @@ main_after_if_else@2: // smart_contracts/asset_labeling/contract.py:38 // class AssetLabeling(ARC4Contract): txn NumAppArgs - bz main_bare_routing@15 - pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]" + bz main_bare_routing@16 + pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]" txna ApplicationArgs 0 - match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_add_operator_to_label_route@9 main_remove_operator_from_label_route@10 main_get_operator_labels_route@11 main_add_label_to_asset_route@12 main_remove_label_from_asset_route@13 main_get_asset_labels_route@14 + match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 -main_after_if_else@17: +main_after_if_else@18: // smart_contracts/asset_labeling/contract.py:38 // class AssetLabeling(ARC4Contract): intc_1 // 0 return -main_get_asset_labels_route@14: - // smart_contracts/asset_labeling/contract.py:249 +main_get_asset_labels_route@15: + // smart_contracts/asset_labeling/contract.py:254 // @abimethod(readonly=True) txn OnCompletion ! @@ -41,7 +41,7 @@ main_get_asset_labels_route@14: txna ApplicationArgs 1 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:249 + // smart_contracts/asset_labeling/contract.py:254 // @abimethod(readonly=True) callsub get_asset_labels bytec_3 // 0x151f7c75 @@ -51,8 +51,8 @@ main_get_asset_labels_route@14: intc_0 // 1 return -main_remove_label_from_asset_route@13: - // smart_contracts/asset_labeling/contract.py:215 +main_remove_label_from_asset_route@14: + // smart_contracts/asset_labeling/contract.py:220 // @abimethod() txn OnCompletion ! @@ -66,14 +66,14 @@ main_remove_label_from_asset_route@13: txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:215 + // smart_contracts/asset_labeling/contract.py:220 // @abimethod() callsub remove_label_from_asset intc_0 // 1 return -main_add_label_to_asset_route@12: - // smart_contracts/asset_labeling/contract.py:187 +main_add_label_to_asset_route@13: + // smart_contracts/asset_labeling/contract.py:192 // @abimethod() txn OnCompletion ! @@ -87,14 +87,14 @@ main_add_label_to_asset_route@12: txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:187 + // smart_contracts/asset_labeling/contract.py:192 // @abimethod() callsub add_label_to_asset intc_0 // 1 return -main_get_operator_labels_route@11: - // smart_contracts/asset_labeling/contract.py:173 +main_get_operator_labels_route@12: + // smart_contracts/asset_labeling/contract.py:178 // @abimethod(readonly=True) txn OnCompletion ! @@ -106,7 +106,7 @@ main_get_operator_labels_route@11: txna ApplicationArgs 1 btoi txnas Accounts - // smart_contracts/asset_labeling/contract.py:173 + // smart_contracts/asset_labeling/contract.py:178 // @abimethod(readonly=True) callsub get_operator_labels bytec_3 // 0x151f7c75 @@ -116,8 +116,8 @@ main_get_operator_labels_route@11: intc_0 // 1 return -main_remove_operator_from_label_route@10: - // smart_contracts/asset_labeling/contract.py:132 +main_remove_operator_from_label_route@11: + // smart_contracts/asset_labeling/contract.py:137 // @abimethod() txn OnCompletion ! @@ -131,14 +131,14 @@ main_remove_operator_from_label_route@10: txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:132 + // smart_contracts/asset_labeling/contract.py:137 // @abimethod() callsub remove_operator_from_label intc_0 // 1 return -main_add_operator_to_label_route@9: - // smart_contracts/asset_labeling/contract.py:104 +main_add_operator_to_label_route@10: + // smart_contracts/asset_labeling/contract.py:109 // @abimethod() txn OnCompletion ! @@ -152,12 +152,29 @@ main_add_operator_to_label_route@9: txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:104 + // smart_contracts/asset_labeling/contract.py:109 // @abimethod() callsub add_operator_to_label intc_0 // 1 return +main_log_labels_route@9: + // smart_contracts/asset_labeling/contract.py:78 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:38 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:78 + // @abimethod(readonly=True) + callsub log_labels + intc_0 // 1 + return + main_get_label_route@8: // smart_contracts/asset_labeling/contract.py:73 // @abimethod(readonly=True) @@ -237,11 +254,11 @@ main_change_admin_route@5: intc_0 // 1 return -main_bare_routing@15: +main_bare_routing@16: // smart_contracts/asset_labeling/contract.py:38 // class AssetLabeling(ARC4Contract): txn OnCompletion - bnz main_after_if_else@17 + bnz main_after_if_else@18 txn ApplicationID ! assert // can only call when creating @@ -557,13 +574,63 @@ get_label_after_if_else@3: retsub +// smart_contracts.asset_labeling.contract.AssetLabeling.log_labels(ids: bytes) -> void: +log_labels: + // smart_contracts/asset_labeling/contract.py:78-79 + // @abimethod(readonly=True) + // def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:80 + // for _idx, label_id in uenumerate(ids): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +log_labels_for_header@1: + // smart_contracts/asset_labeling/contract.py:80 + // for _idx, label_id in uenumerate(ids): + frame_dig 1 + frame_dig 0 + < + bz log_labels_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_2 // 2 + * + dig 1 + swap + extract_uint16 + dup2 + extract_uint16 + intc_2 // 2 + + + extract3 + // smart_contracts/asset_labeling/contract.py:81 + // log(self.labels[label_id.native]) + extract 2 0 + box_get + assert // check self.labels entry exists + log + intc_0 // 1 + + + frame_bury 1 + b log_labels_for_header@1 + +log_labels_after_for@4: + retsub + + // smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only(label: bytes) -> void: admin_or_operator_only: - // smart_contracts/asset_labeling/contract.py:80-81 + // smart_contracts/asset_labeling/contract.py:85-86 // @subroutine // def admin_or_operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:82 + // smart_contracts/asset_labeling/contract.py:87 // if Txn.sender == self.admin: txn Sender intc_1 // 0 @@ -572,12 +639,12 @@ admin_or_operator_only: assert // check self.admin exists == bz admin_or_operator_only_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:83 + // smart_contracts/asset_labeling/contract.py:88 // return retsub admin_or_operator_only_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:84 + // smart_contracts/asset_labeling/contract.py:89 // self.operator_only(label) frame_dig -1 callsub operator_only @@ -586,35 +653,35 @@ admin_or_operator_only_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.operator_only(label: bytes) -> void: operator_only: - // smart_contracts/asset_labeling/contract.py:86-87 + // smart_contracts/asset_labeling/contract.py:91-92 // @subroutine // def operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:89 + // smart_contracts/asset_labeling/contract.py:94 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) txn Sender frame_dig -1 callsub get_operator_label_index intc 4 // 4294967296 != - // smart_contracts/asset_labeling/contract.py:89-91 + // smart_contracts/asset_labeling/contract.py:94-96 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), bz operator_only_bool_false@3 - // smart_contracts/asset_labeling/contract.py:90 + // smart_contracts/asset_labeling/contract.py:95 // and self.get_operator_label_index(Txn.sender, label) txn Sender frame_dig -1 callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:91 + // smart_contracts/asset_labeling/contract.py:96 // != UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:90-91 + // smart_contracts/asset_labeling/contract.py:95-96 // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), != - // smart_contracts/asset_labeling/contract.py:89-91 + // smart_contracts/asset_labeling/contract.py:94-96 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), @@ -625,7 +692,7 @@ operator_only_bool_merge@4: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz operator_only_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:92 + // smart_contracts/asset_labeling/contract.py:97 // S("ERR:UNAUTH"), bytec 5 // "ERR:UNAUTH" // smart_contracts/asset_labeling/contract.py:28 @@ -645,27 +712,27 @@ operator_only_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index(operator: bytes, label: bytes) -> uint64: get_operator_label_index: - // smart_contracts/asset_labeling/contract.py:95-96 + // smart_contracts/asset_labeling/contract.py:100-101 // @subroutine // def get_operator_label_index(self, operator: Account, label: String) -> UInt64: proto 2 1 intc_1 // 0 bytec_2 // "" dup - // smart_contracts/asset_labeling/contract.py:97 + // smart_contracts/asset_labeling/contract.py:102 // if operator not in self.operators: frame_dig -2 box_len bury 1 bnz get_operator_label_index_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:98 + // smart_contracts/asset_labeling/contract.py:103 // return UInt64(NOT_FOUND_KEY) intc 4 // 4294967296 frame_bury 0 retsub get_operator_label_index_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:99 + // smart_contracts/asset_labeling/contract.py:104 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig -2 box_get @@ -681,7 +748,7 @@ get_operator_label_index_after_if_else@2: frame_bury 2 get_operator_label_index_for_header@3: - // smart_contracts/asset_labeling/contract.py:99 + // smart_contracts/asset_labeling/contract.py:104 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig 2 frame_dig 1 @@ -700,13 +767,13 @@ get_operator_label_index_for_header@3: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:100 + // smart_contracts/asset_labeling/contract.py:105 // if stored_label == label: extract 2 0 frame_dig -1 == bz get_operator_label_index_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:101 + // smart_contracts/asset_labeling/contract.py:106 // return idx frame_dig 2 frame_bury 0 @@ -720,7 +787,7 @@ get_operator_label_index_after_if_else@6: b get_operator_label_index_for_header@3 get_operator_label_index_after_for@8: - // smart_contracts/asset_labeling/contract.py:102 + // smart_contracts/asset_labeling/contract.py:107 // return UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 frame_bury 0 @@ -729,15 +796,15 @@ get_operator_label_index_after_for@8: // smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label(operator: bytes, label: bytes) -> void: add_operator_to_label: - // smart_contracts/asset_labeling/contract.py:104-105 + // smart_contracts/asset_labeling/contract.py:109-110 // @abimethod() // def add_operator_to_label(self, operator: Account, label: String) -> None: proto 2 0 - // smart_contracts/asset_labeling/contract.py:106 + // smart_contracts/asset_labeling/contract.py:111 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:107 + // smart_contracts/asset_labeling/contract.py:112 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len @@ -745,7 +812,7 @@ add_operator_to_label: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_operator_to_label_after_if_else@10 - // smart_contracts/asset_labeling/contract.py:107 + // smart_contracts/asset_labeling/contract.py:112 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -756,29 +823,29 @@ add_operator_to_label: err add_operator_to_label_after_if_else@10: - // smart_contracts/asset_labeling/contract.py:108-109 + // smart_contracts/asset_labeling/contract.py:113-114 // # check if operator exists already // if operator in self.operators: frame_dig -2 box_len bury 1 bz add_operator_to_label_else_body@2 - // smart_contracts/asset_labeling/contract.py:112 + // smart_contracts/asset_labeling/contract.py:117 // self.get_operator_label_index(operator, label) frame_dig -2 frame_dig -1 callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:113 + // smart_contracts/asset_labeling/contract.py:118 // == UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:112-113 + // smart_contracts/asset_labeling/contract.py:117-118 // self.get_operator_label_index(operator, label) // == UInt64(NOT_FOUND_VALUE), == // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_operator_to_label_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:114 + // smart_contracts/asset_labeling/contract.py:119 // S("ERR:EXISTS"), bytec 4 // "ERR:EXISTS" // smart_contracts/asset_labeling/contract.py:28 @@ -789,13 +856,13 @@ add_operator_to_label_after_if_else@10: err add_operator_to_label_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:117-118 + // smart_contracts/asset_labeling/contract.py:122-123 // # add label to operator // existing = self.operators[operator].copy() frame_dig -2 box_get assert // check self.operators entry exists - // smart_contracts/asset_labeling/contract.py:119 + // smart_contracts/asset_labeling/contract.py:124 // existing.append(arc4.String(label)) frame_dig -1 len @@ -805,7 +872,7 @@ add_operator_to_label_after_if_else@6: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:120 + // smart_contracts/asset_labeling/contract.py:125 // self.operators[operator] = existing.copy() frame_dig -2 box_del @@ -815,26 +882,26 @@ add_operator_to_label_after_if_else@6: box_put add_operator_to_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:125-126 + // smart_contracts/asset_labeling/contract.py:130-131 // # increment label operators // label_descriptor = self.labels[label].copy() frame_dig -1 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:128 + // smart_contracts/asset_labeling/contract.py:133 // label_descriptor.num_operators.native + UInt64(1) dup pushint 10 // 10 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:127-129 + // smart_contracts/asset_labeling/contract.py:132-134 // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native + UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:130 + // smart_contracts/asset_labeling/contract.py:135 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -845,7 +912,7 @@ add_operator_to_label_after_if_else@3: retsub add_operator_to_label_else_body@2: - // smart_contracts/asset_labeling/contract.py:122-123 + // smart_contracts/asset_labeling/contract.py:127-128 // # new operator, create new box // self.operators[operator] = arc4.DynamicArray(arc4.String(label)) frame_dig -1 @@ -871,7 +938,7 @@ add_operator_to_label_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label(operator: bytes, label: bytes) -> void: remove_operator_from_label: - // smart_contracts/asset_labeling/contract.py:132-133 + // smart_contracts/asset_labeling/contract.py:137-138 // @abimethod() // def remove_operator_from_label(self, operator: Account, label: String) -> None: proto 2 0 @@ -879,11 +946,11 @@ remove_operator_from_label: dupn 4 bytec_2 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:134 + // smart_contracts/asset_labeling/contract.py:139 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:136 + // smart_contracts/asset_labeling/contract.py:141 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len @@ -891,7 +958,7 @@ remove_operator_from_label: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@28 - // smart_contracts/asset_labeling/contract.py:136 + // smart_contracts/asset_labeling/contract.py:141 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -902,7 +969,7 @@ remove_operator_from_label: err remove_operator_from_label_after_if_else@28: - // smart_contracts/asset_labeling/contract.py:137 + // smart_contracts/asset_labeling/contract.py:142 // ensure(operator in self.operators, S("ERR:NOEXIST")) frame_dig -2 box_len @@ -910,7 +977,7 @@ remove_operator_from_label_after_if_else@28: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@32 - // smart_contracts/asset_labeling/contract.py:137 + // smart_contracts/asset_labeling/contract.py:142 // ensure(operator in self.operators, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -921,7 +988,7 @@ remove_operator_from_label_after_if_else@28: err remove_operator_from_label_after_if_else@32: - // smart_contracts/asset_labeling/contract.py:139-140 + // smart_contracts/asset_labeling/contract.py:144-145 // # ensure label exists in operator // label_idx = self.get_operator_label_index(operator, label) frame_dig -2 @@ -929,27 +996,27 @@ remove_operator_from_label_after_if_else@32: callsub get_operator_label_index dup frame_bury 7 - // smart_contracts/asset_labeling/contract.py:142 + // smart_contracts/asset_labeling/contract.py:147 // label_idx != UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 != - // smart_contracts/asset_labeling/contract.py:142-144 + // smart_contracts/asset_labeling/contract.py:147-149 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above bz remove_operator_from_label_bool_false@3 - // smart_contracts/asset_labeling/contract.py:143-144 + // smart_contracts/asset_labeling/contract.py:148-149 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above frame_dig 7 - // smart_contracts/asset_labeling/contract.py:144 + // smart_contracts/asset_labeling/contract.py:149 // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above intc 4 // 4294967296 - // smart_contracts/asset_labeling/contract.py:143-144 + // smart_contracts/asset_labeling/contract.py:148-149 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above != - // smart_contracts/asset_labeling/contract.py:142-144 + // smart_contracts/asset_labeling/contract.py:147-149 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above @@ -960,7 +1027,7 @@ remove_operator_from_label_bool_merge@4: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@24 - // smart_contracts/asset_labeling/contract.py:145 + // smart_contracts/asset_labeling/contract.py:150 // S("ERR:NOEXIST"), bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -971,7 +1038,7 @@ remove_operator_from_label_bool_merge@4: err remove_operator_from_label_after_if_else@24: - // smart_contracts/asset_labeling/contract.py:148-149 + // smart_contracts/asset_labeling/contract.py:153-154 // # ensure only empty labels can be left operator-less // label_descriptor = self.labels[label].copy() frame_dig -1 @@ -981,7 +1048,7 @@ remove_operator_from_label_after_if_else@24: cover 2 frame_bury 0 assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:151 + // smart_contracts/asset_labeling/contract.py:156 // label_descriptor.num_operators > 1 or label_descriptor.num_assets == 0, extract 10 8 // on error: Index access is out of bounds pushbytes 0x0000000000000001 @@ -1000,7 +1067,7 @@ remove_operator_from_label_bool_merge@8: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:152 + // smart_contracts/asset_labeling/contract.py:157 // S("ERR:NOEMPTY"), bytec 8 // "ERR:NOEMPTY" // smart_contracts/asset_labeling/contract.py:28 @@ -1011,7 +1078,7 @@ remove_operator_from_label_bool_merge@8: err remove_operator_from_label_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:156 + // smart_contracts/asset_labeling/contract.py:161 // label_descriptor.num_operators.native - UInt64(1) frame_dig 0 dup @@ -1019,14 +1086,14 @@ remove_operator_from_label_after_if_else@20: extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:154-157 + // smart_contracts/asset_labeling/contract.py:159-162 // # decr operator count // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native - UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:158 + // smart_contracts/asset_labeling/contract.py:163 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -1034,7 +1101,7 @@ remove_operator_from_label_after_if_else@20: frame_dig -1 swap box_put - // smart_contracts/asset_labeling/contract.py:160 + // smart_contracts/asset_labeling/contract.py:165 // if self.operators[operator].length == 1: frame_dig -2 box_get @@ -1044,7 +1111,7 @@ remove_operator_from_label_after_if_else@20: intc_0 // 1 == bz remove_operator_from_label_else_body@10 - // smart_contracts/asset_labeling/contract.py:161 + // smart_contracts/asset_labeling/contract.py:166 // del self.operators[operator] frame_dig -2 box_del @@ -1052,11 +1119,11 @@ remove_operator_from_label_after_if_else@20: retsub remove_operator_from_label_else_body@10: - // smart_contracts/asset_labeling/contract.py:163 + // smart_contracts/asset_labeling/contract.py:168 // next_list = arc4.DynamicArray[arc4.String]() bytec 11 // 0x0000 frame_bury 2 - // smart_contracts/asset_labeling/contract.py:164-167 + // smart_contracts/asset_labeling/contract.py:169-172 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1075,7 +1142,7 @@ remove_operator_from_label_else_body@10: frame_bury 6 remove_operator_from_label_for_header@11: - // smart_contracts/asset_labeling/contract.py:164-167 + // smart_contracts/asset_labeling/contract.py:169-172 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1100,14 +1167,14 @@ remove_operator_from_label_for_header@11: + extract3 frame_bury 4 - // smart_contracts/asset_labeling/contract.py:168 + // smart_contracts/asset_labeling/contract.py:173 // if label_idx != idx: frame_dig 7 != frame_dig 2 frame_bury 3 bz remove_operator_from_label_after_if_else@14 - // smart_contracts/asset_labeling/contract.py:169 + // smart_contracts/asset_labeling/contract.py:174 // next_list.append(stored_label) frame_dig 2 frame_dig 4 @@ -1125,7 +1192,7 @@ remove_operator_from_label_after_if_else@14: b remove_operator_from_label_for_header@11 remove_operator_from_label_after_for@16: - // smart_contracts/asset_labeling/contract.py:171 + // smart_contracts/asset_labeling/contract.py:176 // self.operators[operator] = next_list.copy() frame_dig -2 box_del @@ -1146,11 +1213,11 @@ remove_operator_from_label_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels(operator: bytes) -> bytes: get_operator_labels: - // smart_contracts/asset_labeling/contract.py:173-174 + // smart_contracts/asset_labeling/contract.py:178-179 // @abimethod(readonly=True) // def get_operator_labels(self, operator: Account) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:175 + // smart_contracts/asset_labeling/contract.py:180 // ensure(operator in self.operators, S("ERR:NOEXIST")) frame_dig -1 box_len @@ -1158,7 +1225,7 @@ get_operator_labels: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz get_operator_labels_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:175 + // smart_contracts/asset_labeling/contract.py:180 // ensure(operator in self.operators, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1169,7 +1236,7 @@ get_operator_labels: err get_operator_labels_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:176 + // smart_contracts/asset_labeling/contract.py:181 // return self.operators[operator] frame_dig -1 box_get @@ -1179,7 +1246,7 @@ get_operator_labels_after_if_else@3: // smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset(label: bytes, asset: uint64) -> void: add_label_to_asset: - // smart_contracts/asset_labeling/contract.py:187-188 + // smart_contracts/asset_labeling/contract.py:192-193 // @abimethod() // def add_label_to_asset(self, label: String, asset: Asset) -> None: proto 2 0 @@ -1187,7 +1254,7 @@ add_label_to_asset: dup bytec_2 // "" dup - // smart_contracts/asset_labeling/contract.py:189 + // smart_contracts/asset_labeling/contract.py:194 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len @@ -1195,7 +1262,7 @@ add_label_to_asset: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_label_to_asset_after_if_else@19 - // smart_contracts/asset_labeling/contract.py:189 + // smart_contracts/asset_labeling/contract.py:194 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1206,11 +1273,11 @@ add_label_to_asset: err add_label_to_asset_after_if_else@19: - // smart_contracts/asset_labeling/contract.py:191 + // smart_contracts/asset_labeling/contract.py:196 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:193 + // smart_contracts/asset_labeling/contract.py:198 // if asset in self.assets: frame_dig -1 itob @@ -1219,25 +1286,25 @@ add_label_to_asset_after_if_else@19: box_len bury 1 bz add_label_to_asset_else_body@2 - // smart_contracts/asset_labeling/contract.py:180 + // smart_contracts/asset_labeling/contract.py:185 // if asset not in self.assets: frame_dig 1 box_len bury 1 bnz add_label_to_asset_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:181 + // smart_contracts/asset_labeling/contract.py:186 // return UInt64(NOT_FOUND_KEY) intc 4 // 4294967296 add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12: - // smart_contracts/asset_labeling/contract.py:196 + // smart_contracts/asset_labeling/contract.py:201 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 == // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_label_to_asset_after_if_else@15 - // smart_contracts/asset_labeling/contract.py:197 + // smart_contracts/asset_labeling/contract.py:202 // S("ERR:EXISTS"), bytec 4 // "ERR:EXISTS" // smart_contracts/asset_labeling/contract.py:28 @@ -1248,14 +1315,14 @@ add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLa err add_label_to_asset_after_if_else@15: - // smart_contracts/asset_labeling/contract.py:200-201 + // smart_contracts/asset_labeling/contract.py:205-206 // # add label to operator // existing = self.assets[asset].copy() frame_dig 1 dup box_get assert // check self.assets entry exists - // smart_contracts/asset_labeling/contract.py:202 + // smart_contracts/asset_labeling/contract.py:207 // existing.append(arc4.String(label)) frame_dig -2 len @@ -1265,7 +1332,7 @@ add_label_to_asset_after_if_else@15: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:203 + // smart_contracts/asset_labeling/contract.py:208 // self.assets[asset] = existing.copy() dig 1 box_del @@ -1273,26 +1340,26 @@ add_label_to_asset_after_if_else@15: box_put add_label_to_asset_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:208-209 + // smart_contracts/asset_labeling/contract.py:213-214 // # incr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:211 + // smart_contracts/asset_labeling/contract.py:216 // label_descriptor.num_assets.native + UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:210-212 + // smart_contracts/asset_labeling/contract.py:215-217 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native + UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:213 + // smart_contracts/asset_labeling/contract.py:218 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1303,7 +1370,7 @@ add_label_to_asset_after_if_else@3: retsub add_label_to_asset_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:182 + // smart_contracts/asset_labeling/contract.py:187 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 1 box_get @@ -1319,7 +1386,7 @@ add_label_to_asset_after_if_else@6: frame_bury 3 add_label_to_asset_for_header@7: - // smart_contracts/asset_labeling/contract.py:182 + // smart_contracts/asset_labeling/contract.py:187 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 3 frame_dig 2 @@ -1338,14 +1405,14 @@ add_label_to_asset_for_header@7: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:183 + // smart_contracts/asset_labeling/contract.py:188 // if stored_label == label: extract 2 0 frame_dig -2 == bz add_label_to_asset_after_if_else@10 frame_dig 3 - // smart_contracts/asset_labeling/contract.py:196 + // smart_contracts/asset_labeling/contract.py:201 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 @@ -1357,15 +1424,15 @@ add_label_to_asset_after_if_else@10: b add_label_to_asset_for_header@7 add_label_to_asset_after_for@11: - // smart_contracts/asset_labeling/contract.py:185 + // smart_contracts/asset_labeling/contract.py:190 // return UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:196 + // smart_contracts/asset_labeling/contract.py:201 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 add_label_to_asset_else_body@2: - // smart_contracts/asset_labeling/contract.py:205-206 + // smart_contracts/asset_labeling/contract.py:210-211 // # new operator, create new box // self.assets[asset] = arc4.DynamicArray(arc4.String(label)) frame_dig -2 @@ -1391,7 +1458,7 @@ add_label_to_asset_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset(label: bytes, asset: uint64) -> void: remove_label_from_asset: - // smart_contracts/asset_labeling/contract.py:215-216 + // smart_contracts/asset_labeling/contract.py:220-221 // @abimethod() // def remove_label_from_asset(self, label: String, asset: Asset) -> None: proto 2 0 @@ -1399,7 +1466,7 @@ remove_label_from_asset: dupn 3 bytec_2 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:217 + // smart_contracts/asset_labeling/contract.py:222 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len @@ -1407,7 +1474,7 @@ remove_label_from_asset: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_label_from_asset_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:217 + // smart_contracts/asset_labeling/contract.py:222 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1418,15 +1485,15 @@ remove_label_from_asset: err remove_label_from_asset_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:219 + // smart_contracts/asset_labeling/contract.py:224 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:221 + // smart_contracts/asset_labeling/contract.py:226 // found = False intc_1 // 0 frame_bury 5 - // smart_contracts/asset_labeling/contract.py:222 + // smart_contracts/asset_labeling/contract.py:227 // if self.assets[asset].length == 1: frame_dig -1 itob @@ -1439,7 +1506,7 @@ remove_label_from_asset_after_if_else@20: intc_0 // 1 == bz remove_label_from_asset_else_body@5 - // smart_contracts/asset_labeling/contract.py:223 + // smart_contracts/asset_labeling/contract.py:228 // if self.assets[asset][0] == label: frame_dig 3 box_get @@ -1462,12 +1529,12 @@ remove_label_from_asset_after_if_else@20: frame_dig -2 == bz remove_label_from_asset_else_body@3 - // smart_contracts/asset_labeling/contract.py:224 + // smart_contracts/asset_labeling/contract.py:229 // del self.assets[asset] frame_dig 3 box_del pop - // smart_contracts/asset_labeling/contract.py:225 + // smart_contracts/asset_labeling/contract.py:230 // found = True intc_0 // 1 frame_bury 5 @@ -1477,7 +1544,7 @@ remove_label_from_asset_after_if_else@13: // if not cond: frame_dig 5 bnz remove_label_from_asset_after_if_else@16 - // smart_contracts/asset_labeling/contract.py:240 + // smart_contracts/asset_labeling/contract.py:245 // ensure(found, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1488,26 +1555,26 @@ remove_label_from_asset_after_if_else@13: err remove_label_from_asset_after_if_else@16: - // smart_contracts/asset_labeling/contract.py:242-243 + // smart_contracts/asset_labeling/contract.py:247-248 // # decr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:245 + // smart_contracts/asset_labeling/contract.py:250 // label_descriptor.num_assets.native - UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:244-246 + // smart_contracts/asset_labeling/contract.py:249-251 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native - UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:247 + // smart_contracts/asset_labeling/contract.py:252 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1518,18 +1585,18 @@ remove_label_from_asset_after_if_else@16: retsub remove_label_from_asset_else_body@3: - // smart_contracts/asset_labeling/contract.py:227 + // smart_contracts/asset_labeling/contract.py:232 // found = False intc_1 // 0 frame_bury 5 b remove_label_from_asset_after_if_else@13 remove_label_from_asset_else_body@5: - // smart_contracts/asset_labeling/contract.py:229 + // smart_contracts/asset_labeling/contract.py:234 // next_list = arc4.DynamicArray[arc4.String]() bytec 11 // 0x0000 frame_bury 1 - // smart_contracts/asset_labeling/contract.py:230-232 + // smart_contracts/asset_labeling/contract.py:235-237 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1547,7 +1614,7 @@ remove_label_from_asset_else_body@5: frame_bury 6 remove_label_from_asset_for_header@6: - // smart_contracts/asset_labeling/contract.py:230-232 + // smart_contracts/asset_labeling/contract.py:235-237 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1570,13 +1637,13 @@ remove_label_from_asset_for_header@6: extract3 dup frame_bury 2 - // smart_contracts/asset_labeling/contract.py:233 + // smart_contracts/asset_labeling/contract.py:238 // if stored_label != label: extract 2 0 frame_dig -2 != bz remove_label_from_asset_else_body@9 - // smart_contracts/asset_labeling/contract.py:234 + // smart_contracts/asset_labeling/contract.py:239 // next_list.append(stored_label) frame_dig 1 frame_dig 2 @@ -1592,14 +1659,14 @@ remove_label_from_asset_after_if_else@10: b remove_label_from_asset_for_header@6 remove_label_from_asset_else_body@9: - // smart_contracts/asset_labeling/contract.py:236 + // smart_contracts/asset_labeling/contract.py:241 // found = True intc_0 // 1 frame_bury 5 b remove_label_from_asset_after_if_else@10 remove_label_from_asset_after_for@12: - // smart_contracts/asset_labeling/contract.py:238 + // smart_contracts/asset_labeling/contract.py:243 // self.assets[asset] = next_list.copy() frame_dig 3 dup @@ -1612,11 +1679,11 @@ remove_label_from_asset_after_for@12: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels(asset: uint64) -> bytes: get_asset_labels: - // smart_contracts/asset_labeling/contract.py:249-250 + // smart_contracts/asset_labeling/contract.py:254-255 // @abimethod(readonly=True) // def get_asset_labels(self, asset: Asset) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:251 + // smart_contracts/asset_labeling/contract.py:256 // ensure(asset in self.assets, S("ERR:NOEXIST")) frame_dig -1 itob @@ -1626,7 +1693,7 @@ get_asset_labels: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz get_asset_labels_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:251 + // smart_contracts/asset_labeling/contract.py:256 // ensure(asset in self.assets, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1637,7 +1704,7 @@ get_asset_labels: err get_asset_labels_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:252 + // smart_contracts/asset_labeling/contract.py:257 // return self.assets[asset] frame_dig 0 box_get diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json index 2af8c01..53a47da 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json @@ -106,6 +106,27 @@ "events": [], "recommendations": {} }, + { + "name": "log_labels", + "args": [ + { + "type": "string[]", + "name": "ids" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, { "name": "add_operator_to_label", "args": [ @@ -309,85 +330,88 @@ "sourceInfo": [ { "pc": [ - 668, - 1051, - 1070, - 1495 + 690, + 1124, + 1143, + 1568 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ - 201, - 223, - 247, - 271, - 293, - 317, - 341, + 208, + 230, + 254, + 278, + 300, + 324, + 348, 363, - 381, - 405 + 385, + 403, + 427 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ - 428 + 450 ], "errorMessage": "can only call when creating" }, { "pc": [ - 204, - 226, - 250, - 274, - 296, - 320, - 344, + 211, + 233, + 257, + 281, + 303, + 327, + 351, 366, - 384, - 408 + 388, + 406, + 430 ], "errorMessage": "can only call when not creating" }, { "pc": [ - 543, - 713 + 565, + 786 ], "errorMessage": "check self.admin exists" }, { "pc": [ - 1302, - 1352, - 1476, - 1487, - 1568, - 1669 + 1375, + 1425, + 1549, + 1560, + 1641, + 1742 ], "errorMessage": "check self.assets entry exists" }, { "pc": [ - 667, - 703, - 927, - 1050, - 1325, - 1531 + 689, + 725, + 768, + 1000, + 1123, + 1398, + 1604 ], "errorMessage": "check self.labels entry exists" }, { "pc": [ - 794, - 901, - 1109, - 1135, - 1242 + 867, + 974, + 1182, + 1208, + 1315 ], "errorMessage": "check self.operators entry exists" } @@ -400,11 +424,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTUKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5IG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTAgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDExIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEyIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTMgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OS05MQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MC05MQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTcKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4LTEwOQogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTQKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTctMTE4CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA5IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMi0xMzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzQKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzktMTQwCiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDIKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0My0xNDQKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MgogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDggLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU3CiAgICAvLyAjIGRlY3Igb3BlcmF0b3IgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gaWYgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBkZWwgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQtMTY3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzEKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzUKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ny0xODgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwLTIxMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjUKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyLTI0MwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQtMjQ2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5CiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAtMjMyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwLTIzMgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgIT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDEKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9wdXQKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9sYWJlbHMoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBWFkbWluAAQVH3x1CkVSUjpFWElTVFMKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgACAgABAgAAMRhAAAQpMQBnMRtBAS2CCgSPDX2OBHwbMvYEF+aRrgQz0P/cBPrBzxsEtMULnwSi3SJHBKN96hEEaPGO+gTC7XQ/NhoAjgoAzgC2AKQAjgB2AF4ASAAwABgAAiNDMRkURDEYRDYaARfAMIgFnCtMULAiQzEZFEQxGEQ2GgFXAgA2GgIXwDCIBK8iQzEZFEQxGEQ2GgFXAgA2GgIXwDCIA9IiQzEZFEQxGEQ2GgEXwByIA60rTFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiAKXIkMxGRREMRhENhoBF8AcNhoCVwIAiAIHIkMxGRREMRhENhoBVwIAiAFMK0xQsCJDMRkURDEYRDYaAVcCAIgBAyJDMRkURDEYRDYaAVcCADYaAlcCAIgApCJDMRkURDEYRDYaARfAHIgAhyJDMRlA/xsxGBREIkOKAwGL/SNZSYv/CEwkCyQISwEWVwYCTgKL/SRLAlKL/yQLr1CL/RWL/U8DTwJSUIv+UEwkC0kjTIsDiwIMQQAjiwRJFlcGAosBiwNJTgRPAl1JjAFLAVkkCAiMBCQIjANC/9WLAIsBUIwAiTEAIyllRBJAAAQnBbAAiYoBAIj/6ymL/2eJigIAiP/gi/69RQFBAAQnBLAAi/4VJBJAAAQnBrAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5mL/71FAUAAAyiwAIv/FSQSQAAEJwawAIv/vkRXAggnB6hAAAQnCLAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAMQAjKWVEEkEAAYmL/4gAAYmKAQAxAIv/iAAfIQQTQQAVMQCL/4gAEiUTQQAJIkAABCcFsACJI0L/9IoCASMqSYv+vUUBQAAFIQSMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88ljACJigIAi/+I/2KL/71FAUAAAyiwAIv+vUUBQQBAi/6L/4j/hSUSQAAEJwSwAIv+vkSL/xUWVwYCi/9QIoj+G4v+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnCUxQJwpMUIv+vEiL/ky/Qv/NigIAI0cEKkcCi/+I/uSL/71FAUAAAyiwAIv+vUUBQAADKLAAi/6L/4j/BEmMByUTQQDDiwchBBNBALsiQAADKLAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnB6hBAIoiQAAEJwiwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJJwuMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj9B4wDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv9zI0L/QooBAYv/vUUBQAADKLAAi/++RImKAgAjSSpJi/69RQFAAAMosACL/oj94ov/FkmMAb1FAUEAhosBvUUBQAA4IQQlEkAABCcEsACLAUm+RIv+FRZXBgKL/lAiiPyKSwG8SL+L/r5ESSRbIggWXAKL/rxIi/5Mv4mLAb5MSU4CjABEI1mMAiOMA4sDiwIMQQApiwBXAgCLAyQLSwFMWUpZJAhYVwIAi/4SQQAFiwNC/5GLAyIIjANC/88lQv+Ei/4VFlcGAov+UCcJTFAnCkxQiwFJvEhMv0L/iYoCACNHAypHAov+vUUBQAADKLAAi/6I/RsjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAyiwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3ScLjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+1mMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9+igEBi/8WSb1FAUAAAyiwAIsAvkRMiQ==", + "approval": "CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBWFkbWluAAQVH3x1CkVSUjpFWElTVFMKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgACAgABAgAAMRhAAAQpMQBnMRtBAUOCCwSPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD82GgCOCwDdAMUAswCdAI4AdgBeAEgAMAAYAAIjQzEZFEQxGEQ2GgEXwDCIBd4rTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiATxIkMxGRREMRhENhoBVwIANhoCF8AwiAQUIkMxGRREMRhENhoBF8AciAPvK0xQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgC2SJDMRkURDEYRDYaARfAHDYaAlcCAIgCSSJDMRkURDEYRDYaAYgBcSJDMRkURDEYRDYaAVcCAIgBTCtMULAiQzEZFEQxGEQ2GgFXAgCIAQMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIAKQiQzEZFEQxGEQ2GgEXwByIAIciQzEZQP8MMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAIkxACMpZUQSQAAEJwWwAImKAQCI/+spi/9niYoCAIj/4Iv+vUUBQQAEJwSwAIv+FSQSQAAEJwawAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Zi/+9RQFAAAMosACL/xUkEkAABCcGsACL/75EVwIIJweoQAAEJwiwAIv/vEiJigEBi/+9RQFAAAMosACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIyllRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnBbAAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9ii/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcEsACL/r5Ei/8VFlcGAov/UCKI/eiL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwlMUCcKTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ki/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAw4sHIQQTQQC7IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJweoQQCKIkAABCcIsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiScLjAKL/r5MSU4CjAFEI1mMBSOMBosGiwUMQQA4iwFXAgCLBklOAiQLSwFMWUpZJAhYjASLBxOLAowDQQAKiwKLBCKI/NSMA4sDjAKLBiIIjAZC/8CL/rxIi/6LAr+JI0L/cyNC/0KKAQGL/71FAUAAAyiwAIv/vkSJigIAI0kqSYv+vUUBQAADKLAAi/6I/eKL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBLAAiwFJvkSL/hUWVwYCi/5QIoj8V0sBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnCUxQJwpMUIsBSbxITL9C/4mKAgAjRwMqRwKL/r1FAUAAAyiwAIv+iP0bI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90nC4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPsmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/fooBAYv/Fkm9RQFAAAMosACLAL5ETIk=", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts index 57db58f..55d6489 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[668,1051,1070,1495],"errorMessage":"Index access is out of bounds"},{"pc":[201,223,247,271,293,317,341,363,381,405],"errorMessage":"OnCompletion is not NoOp"},{"pc":[428],"errorMessage":"can only call when creating"},{"pc":[204,226,250,274,296,320,344,366,384,408],"errorMessage":"can only call when not creating"},{"pc":[543,713],"errorMessage":"check self.admin exists"},{"pc":[1302,1352,1476,1487,1568,1669],"errorMessage":"check self.assets entry exists"},{"pc":[667,703,927,1050,1325,1531],"errorMessage":"check self.labels entry exists"},{"pc":[794,901,1109,1135,1242],"errorMessage":"check self.operators entry exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTUKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5IG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTAgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDExIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEyIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTMgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MC04MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OS05MQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MC05MQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTcKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4LTEwOQogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTItMTEzCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTQKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTctMTE4CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA5IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMCAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMi0xMzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzQKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzktMTQwCiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDIKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0My0xNDQKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyLTE0NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MgogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDggLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU3CiAgICAvLyAjIGRlY3Igb3BlcmF0b3IgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gaWYgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBkZWwgc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQtMTY3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzEKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzUKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ny0xODgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwLTIxMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjUKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyLTI0MwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQtMjQ2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5CiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWMgMTEgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAtMjMyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwLTIzMgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgIT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDEKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9mb3JfaGVhZGVyQDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9wdXQKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9sYWJlbHMoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShhc3NldCBpbiBzZWxmLmFzc2V0cywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1Ygo=","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBWFkbWluAAQVH3x1CkVSUjpFWElTVFMKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgACAgABAgAAMRhAAAQpMQBnMRtBAS2CCgSPDX2OBHwbMvYEF+aRrgQz0P/cBPrBzxsEtMULnwSi3SJHBKN96hEEaPGO+gTC7XQ/NhoAjgoAzgC2AKQAjgB2AF4ASAAwABgAAiNDMRkURDEYRDYaARfAMIgFnCtMULAiQzEZFEQxGEQ2GgFXAgA2GgIXwDCIBK8iQzEZFEQxGEQ2GgFXAgA2GgIXwDCIA9IiQzEZFEQxGEQ2GgEXwByIA60rTFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiAKXIkMxGRREMRhENhoBF8AcNhoCVwIAiAIHIkMxGRREMRhENhoBVwIAiAFMK0xQsCJDMRkURDEYRDYaAVcCAIgBAyJDMRkURDEYRDYaAVcCADYaAlcCAIgApCJDMRkURDEYRDYaARfAHIgAhyJDMRlA/xsxGBREIkOKAwGL/SNZSYv/CEwkCyQISwEWVwYCTgKL/SRLAlKL/yQLr1CL/RWL/U8DTwJSUIv+UEwkC0kjTIsDiwIMQQAjiwRJFlcGAosBiwNJTgRPAl1JjAFLAVkkCAiMBCQIjANC/9WLAIsBUIwAiTEAIyllRBJAAAQnBbAAiYoBAIj/6ymL/2eJigIAiP/gi/69RQFBAAQnBLAAi/4VJBJAAAQnBrAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5mL/71FAUAAAyiwAIv/FSQSQAAEJwawAIv/vkRXAggnB6hAAAQnCLAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAMQAjKWVEEkEAAYmL/4gAAYmKAQAxAIv/iAAfIQQTQQAVMQCL/4gAEiUTQQAJIkAABCcFsACJI0L/9IoCASMqSYv+vUUBQAAFIQSMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88ljACJigIAi/+I/2KL/71FAUAAAyiwAIv+vUUBQQBAi/6L/4j/hSUSQAAEJwSwAIv+vkSL/xUWVwYCi/9QIoj+G4v+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnCUxQJwpMUIv+vEiL/ky/Qv/NigIAI0cEKkcCi/+I/uSL/71FAUAAAyiwAIv+vUUBQAADKLAAi/6L/4j/BEmMByUTQQDDiwchBBNBALsiQAADKLAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnB6hBAIoiQAAEJwiwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJJwuMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj9B4wDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv9zI0L/QooBAYv/vUUBQAADKLAAi/++RImKAgAjSSpJi/69RQFAAAMosACL/oj94ov/FkmMAb1FAUEAhosBvUUBQAA4IQQlEkAABCcEsACLAUm+RIv+FRZXBgKL/lAiiPyKSwG8SL+L/r5ESSRbIggWXAKL/rxIi/5Mv4mLAb5MSU4CjABEI1mMAiOMA4sDiwIMQQApiwBXAgCLAyQLSwFMWUpZJAhYVwIAi/4SQQAFiwNC/5GLAyIIjANC/88lQv+Ei/4VFlcGAov+UCcJTFAnCkxQiwFJvEhMv0L/iYoCACNHAypHAov+vUUBQAADKLAAi/6I/RsjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAyiwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3ScLjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+1mMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9+igEBi/8WSb1FAUAAAyiwAIsAvkRMiQ==","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[690,1124,1143,1568],"errorMessage":"Index access is out of bounds"},{"pc":[208,230,254,278,300,324,348,363,385,403,427],"errorMessage":"OnCompletion is not NoOp"},{"pc":[450],"errorMessage":"can only call when creating"},{"pc":[211,233,257,281,303,327,351,366,388,406,430],"errorMessage":"can only call when not creating"},{"pc":[565,786],"errorMessage":"check self.admin exists"},{"pc":[1375,1425,1549,1560,1641,1742],"errorMessage":"check self.assets entry exists"},{"pc":[689,725,768,1000,1123,1398,1604],"errorMessage":"check self.labels entry exists"},{"pc":[867,974,1182,1208,1315],"errorMessage":"check self.operators entry exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBWFkbWluAAQVH3x1CkVSUjpFWElTVFMKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgACAgABAgAAMRhAAAQpMQBnMRtBAUOCCwSPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD82GgCOCwDdAMUAswCdAI4AdgBeAEgAMAAYAAIjQzEZFEQxGEQ2GgEXwDCIBd4rTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiATxIkMxGRREMRhENhoBVwIANhoCF8AwiAQUIkMxGRREMRhENhoBF8AciAPvK0xQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgC2SJDMRkURDEYRDYaARfAHDYaAlcCAIgCSSJDMRkURDEYRDYaAYgBcSJDMRkURDEYRDYaAVcCAIgBTCtMULAiQzEZFEQxGEQ2GgFXAgCIAQMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIAKQiQzEZFEQxGEQ2GgEXwByIAIciQzEZQP8MMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAIkxACMpZUQSQAAEJwWwAImKAQCI/+spi/9niYoCAIj/4Iv+vUUBQQAEJwSwAIv+FSQSQAAEJwawAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Zi/+9RQFAAAMosACL/xUkEkAABCcGsACL/75EVwIIJweoQAAEJwiwAIv/vEiJigEBi/+9RQFAAAMosACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIyllRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnBbAAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9ii/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcEsACL/r5Ei/8VFlcGAov/UCKI/eiL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwlMUCcKTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ki/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAw4sHIQQTQQC7IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJweoQQCKIkAABCcIsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiScLjAKL/r5MSU4CjAFEI1mMBSOMBosGiwUMQQA4iwFXAgCLBklOAiQLSwFMWUpZJAhYjASLBxOLAowDQQAKiwKLBCKI/NSMA4sDjAKLBiIIjAZC/8CL/rxIi/6LAr+JI0L/cyNC/0KKAQGL/71FAUAAAyiwAIv/vkSJigIAI0kqSYv+vUUBQAADKLAAi/6I/eKL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBLAAiwFJvkSL/hUWVwYCi/5QIoj8V0sBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnCUxQJwpMUIsBSbxITL9C/4mKAgAjRwMqRwKL/r1FAUAAAyiwAIv+iP0bI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90nC4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPsmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/fooBAYv/Fkm9RQFAAAMosACLAL5ETIk=","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -100,6 +100,9 @@ export type AssetLabelingArgs = { 'get_label(string)(string,uint64,uint64)': { id: string } + 'log_labels(string[])void': { + ids: string[] + } 'add_operator_to_label(account,string)void': { operator: Uint8Array | string label: string @@ -131,6 +134,7 @@ export type AssetLabelingArgs = { 'add_label(string,string)void': [id: string, name: string] 'remove_label(string)void': [id: string] 'get_label(string)(string,uint64,uint64)': [id: string] + 'log_labels(string[])void': [ids: string[]] 'add_operator_to_label(account,string)void': [operator: Uint8Array | string, label: string] 'remove_operator_from_label(account,string)void': [operator: Uint8Array | string, label: string] 'get_operator_labels(account)string[]': [operator: Uint8Array | string] @@ -148,6 +152,7 @@ export type AssetLabelingReturns = { 'add_label(string,string)void': void 'remove_label(string)void': void 'get_label(string)(string,uint64,uint64)': LabelDescriptor + 'log_labels(string[])void': void 'add_operator_to_label(account,string)void': void 'remove_operator_from_label(account,string)void': void 'get_operator_labels(account)string[]': string[] @@ -184,6 +189,11 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_label(string)(string,uint64,uint64)'] returns: AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] }> + & Record<'log_labels(string[])void' | 'log_labels', { + argsObj: AssetLabelingArgs['obj']['log_labels(string[])void'] + argsTuple: AssetLabelingArgs['tuple']['log_labels(string[])void'] + returns: AssetLabelingReturns['log_labels(string[])void'] + }> & Record<'add_operator_to_label(account,string)void' | 'add_operator_to_label', { argsObj: AssetLabelingArgs['obj']['add_operator_to_label(account,string)void'] argsTuple: AssetLabelingArgs['tuple']['add_operator_to_label(account,string)void'] @@ -345,6 +355,19 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.id], } } + /** + * Constructs a no op call for the log_labels(string[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static logLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'log_labels(string[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.ids], + } + } /** * Constructs a no op call for the add_operator_to_label(account,string)void ABI method * @@ -705,6 +728,18 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getLabel(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.logLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. * @@ -827,6 +862,18 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getLabel(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.logLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. * @@ -953,6 +1000,19 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_label(string)(string,uint64,uint64)'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + logLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['log_labels(string[])void'])} + }, + /** * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. * @@ -1048,6 +1108,19 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async logLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) + return result.return as unknown as AssetLabelingReturns['log_labels(string[])void'] + } + /** * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. * @@ -1188,6 +1261,14 @@ export class AssetLabelingClient { resultMappers.push((v) => client.decodeReturnValue('get_label(string)(string,uint64,uint64)', v)) return this }, + /** + * Add a log_labels(string[])void method call against the AssetLabeling contract + */ + logLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logLabels(params))) + resultMappers.push(undefined) + return this + }, /** * Add a add_operator_to_label(account,string)void method call against the AssetLabeling contract */ @@ -1307,6 +1388,15 @@ export type AssetLabelingComposer = { */ getLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] | undefined]> + /** + * Calls the log_labels(string[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + logLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['log_labels(string[])void'] | undefined]> + /** * Calls the add_operator_to_label(account,string)void ABI method. * diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index 378c506..ad71a79 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -75,6 +75,11 @@ def get_label(self, id: String) -> LabelDescriptor: ensure(id in self.labels, S("ERR:NOEXIST")) return self.labels[id] + @abimethod(readonly=True) + def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: + for _idx, label_id in uenumerate(ids): + log(self.labels[label_id.native]) + # operator<>label access ops. admin and operators @subroutine From c6ee6f153b9a34253286ac311ece087041f01441 Mon Sep 17 00:00:00 2001 From: Michael Feher Date: Wed, 2 Apr 2025 07:59:41 -0400 Subject: [PATCH 03/15] build(package): add package metadata, bump package artifacts to es2020 --- projects/abel-sdk-v2/package-lock.json | 20 ++++++----------- projects/abel-sdk-v2/package.json | 30 ++++++++++++++++++++++---- projects/abel-sdk-v2/tsconfig.json | 2 +- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/projects/abel-sdk-v2/package-lock.json b/projects/abel-sdk-v2/package-lock.json index 278739c..73730a9 100644 --- a/projects/abel-sdk-v2/package-lock.json +++ b/projects/abel-sdk-v2/package-lock.json @@ -11,12 +11,12 @@ "devDependencies": { "@algorandfoundation/algokit-client-generator": "^4.0.9", "@types/node": "^22.13.17", + "buffer": "^6.0.3", "tsx": "^4.19.3" }, "peerDependencies": { - "@algorandfoundation/algokit-utils": "=7.0.2", - "algosdk": "^2.8.0", - "buffer": "^6.0.3" + "@algorandfoundation/algokit-utils": "^7.0.2", + "algosdk": "^2.8.0" } }, "node_modules/@algorandfoundation/algokit-client-generator": { @@ -527,8 +527,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/bignumber.js": { "version": "9.1.2", @@ -557,7 +556,6 @@ "url": "https://feross.org/support" } ], - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -710,8 +708,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/js-sha256": { "version": "0.9.0", @@ -1049,8 +1046,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "peer": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bignumber.js": { "version": "9.1.2", @@ -1062,7 +1058,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "peer": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -1169,8 +1164,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "peer": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "js-sha256": { "version": "0.9.0", diff --git a/projects/abel-sdk-v2/package.json b/projects/abel-sdk-v2/package.json index 2d5d5e2..e34e9ce 100644 --- a/projects/abel-sdk-v2/package.json +++ b/projects/abel-sdk-v2/package.json @@ -2,7 +2,29 @@ "name": "abel-sdk-v2", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "module": "./dist/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/tasosbit/abel.git", + "directory": "projects/abel-sdk-v2" + }, + "files": [ + "dist", + "src" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./client": { + "types": "./dist/generated/abel-contract-client.d.ts", + "default": "./dist/generated/abel-contract-client.js" + }, + "./arc32.json": "./dist/artifacts/AssetLabeling.arc32.json" + }, "scripts": { "clean": "rm -rf dist/ artifacts/ src/generated/", "prebuild": "npm run clean && scripts/update-artifacts.sh", @@ -15,12 +37,12 @@ "devDependencies": { "@algorandfoundation/algokit-client-generator": "^4.0.9", "@types/node": "^22.13.17", + "buffer": "^6.0.3", "tsx": "^4.19.3" }, "peerDependencies": { - "@algorandfoundation/algokit-utils": "=7.0.2", - "algosdk": "^2.8.0", - "buffer": "^6.0.3" + "@algorandfoundation/algokit-utils": "^7.0.2", + "algosdk": "^2.8.0" }, "type": "module" } diff --git a/projects/abel-sdk-v2/tsconfig.json b/projects/abel-sdk-v2/tsconfig.json index 8c68693..5c3d146 100644 --- a/projects/abel-sdk-v2/tsconfig.json +++ b/projects/abel-sdk-v2/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2016", + "target": "es2020", "module": "nodenext", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, From 7bea02a401002a36b64bef0a673e1568c0b513c8 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 15:55:33 +0300 Subject: [PATCH 04/15] sdk v2: generalized log parser to types values --- abel-sdk-v2 | 1 + contract | 1 + .../artifacts/AssetLabeling.arc32.json | 21 +- projects/abel-sdk-v2/cli/.appid | 2 +- projects/abel-sdk-v2/cli/create.ts | 74 +- .../src/generated/abel-contract-client.ts | 92 +- projects/abel-sdk-v2/src/index.ts | 121 +- projects/abel-sdk-v2/src/types.ts | 1 + projects/abel-sdk-v2/src/util.ts | 1 - .../AssetLabeling.approval.puya.map | 12613 +++++++++------- .../AssetLabeling.approval.teal | 691 +- .../asset_labeling/AssetLabeling.arc56.json | 122 +- .../asset_labeling/AssetLabelingClient.ts | 92 +- .../asset_labeling/contract.py | 31 +- 14 files changed, 8212 insertions(+), 5651 deletions(-) create mode 120000 abel-sdk-v2 create mode 120000 contract diff --git a/abel-sdk-v2 b/abel-sdk-v2 new file mode 120000 index 0000000..a65e7f1 --- /dev/null +++ b/abel-sdk-v2 @@ -0,0 +1 @@ +projects/abel-sdk-v2 \ No newline at end of file diff --git a/contract b/contract new file mode 120000 index 0000000..dcfacbf --- /dev/null +++ b/contract @@ -0,0 +1 @@ +projects/asset_labeling-contracts/smart_contracts/asset_labeling \ No newline at end of file diff --git a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json index 885b5e8..4054ae5 100644 --- a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json +++ b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json @@ -77,10 +77,16 @@ "call_config": { "no_op": "CALL" } + }, + "get_assets_labels(uint64[])string[][]": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -273,6 +279,19 @@ "returns": { "type": "string[]" } + }, + { + "name": "get_assets_labels", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "readonly": true, + "returns": { + "type": "string[][]" + } } ], "networks": {} diff --git a/projects/abel-sdk-v2/cli/.appid b/projects/abel-sdk-v2/cli/.appid index 70ea5f5..fef8095 100644 --- a/projects/abel-sdk-v2/cli/.appid +++ b/projects/abel-sdk-v2/cli/.appid @@ -1 +1 @@ -4776 \ No newline at end of file +4936 \ No newline at end of file diff --git a/projects/abel-sdk-v2/cli/create.ts b/projects/abel-sdk-v2/cli/create.ts index 8fc8ac1..8987ea0 100644 --- a/projects/abel-sdk-v2/cli/create.ts +++ b/projects/abel-sdk-v2/cli/create.ts @@ -5,7 +5,7 @@ import { Config } from "@algorandfoundation/algokit-utils"; const LABEL_ID = process.env.LABEL_ID ?? "pv"; const LABEL_NAME = process.env.LABEL_NAME ?? "Pera Verified"; -const ASSET_ID = 1002n +const ASSET_ID = 1002n; Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); @@ -19,12 +19,12 @@ const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { const { appClient, result } = await factory.deploy({ ignoreCache: true, onUpdate: "append", onSchemaBreak: "append" }); // If app was just created fund the app account -if (['create', 'replace'].includes(result.operationPerformed)) { +if (["create", "replace"].includes(result.operationPerformed)) { await algorand.send.payment({ amount: (0.1).algo(), sender: deployer.addr, receiver: appClient.appAddress, - }) + }); } const { appId } = appClient; @@ -36,45 +36,63 @@ const operator = deployer.addr; const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer }); -const existingLabels = await sdk.getLabelDescriptors(['pv']) -console.log({existingLabels}) +async function logAllState() { + const labels: string[] = await sdk.getAllLabels(); + const operators: string[] = await sdk.getAllOperators(); + const assets: bigint[] = await sdk.getAllAssetIDs(); -if (!existingLabels.has(LABEL_ID)) { - await sdk.addLabel(LABEL_ID, LABEL_NAME); + const labelDescriptors = await sdk.getLabelDescriptors(labels); + const operatorLabels = await Promise.all(operators.map((o) => sdk.getOperatorLabels(o))); + const assetLabels = await sdk.getAssetsLabels(assets); + + console.dir({ labels: labelDescriptors, operators: [operators, operatorLabels], assetLabels }); } -let operatorLabels: string[] = [] -try { - operatorLabels = await sdk.getOperatorLabels(operator) -} catch(e) { - if (e.message !== "ERR:NOEXIST") { - throw e - } +await logAllState(); + +const existingLabels = await sdk.getAllLabels(); +if (!existingLabels.includes(LABEL_ID)) { + console.log("creating label"); + await sdk.addLabel(LABEL_ID, LABEL_NAME); } +console.log("getOperatorLabels"); +let operatorLabels = await sdk.getOperatorLabels(operator); + if (!operatorLabels.includes(LABEL_ID)) { - console.log("adding operator to label") - await sdk.addOperatorToLabel(operator, LABEL_ID) + console.log("adding operator to label"); + await sdk.addOperatorToLabel(operator, LABEL_ID); } +operatorLabels = await sdk.getOperatorLabels(operator); +console.log({ operatorLabels }); -operatorLabels = await sdk.getOperatorLabels(operator) - -console.log({operatorLabels}); +console.log("get all operators", await sdk.getAllOperators()); if (!(await sdk.getAssetLabels(ASSET_ID)).includes(LABEL_ID)) { - console.log("add label to asset") + console.log("add label to asset"); await sdk.addLabelToAsset(ASSET_ID, LABEL_ID); } -const assetLabels = await sdk.getAssetLabels(ASSET_ID) -console.log({assetLabels}); +const assetLabels = await sdk.getAssetLabels(ASSET_ID); +console.log({ assetLabels }); + +console.log("multi with nonexist") +console.log(await sdk.getAssetsLabels([3832n, ASSET_ID])) + + +await logAllState(); +if (process.env.STOP) + process.exit(1); + + +console.log("removing label from asset"); +await sdk.removeLabelFromAsset(ASSET_ID, LABEL_ID); -console.log(await sdk.getLabelDescriptors(['pv'])) -console.log("removing label from asset") -await sdk.removeLabelFromAsset(ASSET_ID, LABEL_ID) +console.log(await sdk.getLabelDescriptors(["pv"])); -console.log(await sdk.getLabelDescriptors(['pv'])) +console.log("removing operator from label"); +await sdk.removeOperatorFromLabel(operator, LABEL_ID); -console.log("removing operator from label") -await sdk.removeOperatorFromLabel(operator, LABEL_ID) +console.log("removing operator from label"); +await sdk.removeLabel(LABEL_ID); diff --git a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts index 8a4921f..b01ea98 100644 --- a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts +++ b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract /** * A state record containing binary data @@ -125,6 +125,9 @@ export type AssetLabelingArgs = { 'get_asset_labels(asset)string[]': { asset: bigint } + 'get_assets_labels(uint64[])string[][]': { + assets: bigint[] | number[] + } } /** * The tuple representation of the arguments for each method @@ -141,6 +144,7 @@ export type AssetLabelingArgs = { 'add_label_to_asset(string,asset)void': [label: string, asset: bigint] 'remove_label_from_asset(string,asset)void': [label: string, asset: bigint] 'get_asset_labels(asset)string[]': [asset: bigint] + 'get_assets_labels(uint64[])string[][]': [assets: bigint[] | number[]] } } @@ -159,6 +163,7 @@ export type AssetLabelingReturns = { 'add_label_to_asset(string,asset)void': void 'remove_label_from_asset(string,asset)void': void 'get_asset_labels(asset)string[]': string[] + 'get_assets_labels(uint64[])string[][]': string[][] } /** @@ -224,6 +229,11 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_asset_labels(asset)string[]'] returns: AssetLabelingReturns['get_asset_labels(asset)string[]'] }> + & Record<'get_assets_labels(uint64[])string[][]' | 'get_assets_labels', { + argsObj: AssetLabelingArgs['obj']['get_assets_labels(uint64[])string[][]'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_labels(uint64[])string[][]'] + returns: AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] + }> /** * Defines the shape of the state of the application. */ @@ -433,6 +443,19 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.asset], } } + /** + * Constructs a no op call for the get_assets_labels(uint64[])string[][] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_labels(uint64[])string[][]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } } /** @@ -791,6 +814,18 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + }, + } /** @@ -925,6 +960,18 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + }, + } /** @@ -1070,6 +1117,19 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_labels(asset)string[]'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_labels(uint64[])string[][]'])} + }, + } /** @@ -1134,6 +1194,19 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_asset_labels(asset)string[]'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] + } + /** * Methods to access state for the current AssetLabeling app */ @@ -1252,6 +1325,14 @@ export class AssetLabelingClient { resultMappers.push((v) => client.decodeReturnValue('get_asset_labels(asset)string[]', v)) return this }, + /** + * Add a get_assets_labels(uint64[])string[][] method call against the AssetLabeling contract + */ + getAssetsLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_assets_labels(uint64[])string[][]', v)) + return this + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -1386,6 +1467,15 @@ export type AssetLabelingComposer = { */ getAssetLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_labels(asset)string[]'] | undefined]> + /** + * Calls the get_assets_labels(uint64[])string[][] ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] | undefined]> + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index d49fc18..a85d7f9 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -1,5 +1,5 @@ import { TransactionSignerAccount } from "@algorandfoundation/algokit-utils/types/account"; -import { decodeAddress, encodeUint64, makeEmptyTransactionSigner } from "algosdk"; +import { decodeAddress, decodeUint64, encodeAddress, encodeUint64, makeEmptyTransactionSigner } from "algosdk"; import { AlgorandClient } from "@algorandfoundation/algokit-utils"; import { BoxName } from "@algorandfoundation/algokit-utils/types/app"; import { @@ -7,7 +7,7 @@ import { AssetLabelingFactory, LabelDescriptorFromTuple as LabelDescriptorBoxValueFromTuple, } from "./generated/abel-contract-client.js"; -import { LabelDescriptor } from "./types.js"; +import { AnyFn, LabelDescriptor } from "./types.js"; import { wrapErrors } from "./util.js"; export * from "./types.js"; @@ -61,42 +61,47 @@ export class AbelSDK { return this.readClient.appId; } - private async getBoxesByLength(length: number): Promise { - const boxNames = await this.readClient.algorand.app.getBoxNames(this.appId); - return boxNames.filter((boxName) => boxName.name.length === 2); + // Box bead wrappers + + async getAllLabels(): Promise { + return (await this.getBoxesByLength(2)).map((boxName) => boxName.name); } - /* - * ts guard for write clients only - */ - requireWriteClient(): asserts this is this & { writeAccount: TransactionSignerAccount } & { writeClient: AssetLabelingClient } { - if (this.writeAccount === undefined || this.writeClient === undefined) { - throw new Error(`A transaction operation was issued on a read-only client`); - } + async getAllOperators(): Promise { + return (await this.getBoxesByLength(32)).map((boxName) => encodeAddress(boxName.nameRaw)); + } + + async getAllAssetIDs(): Promise { + return (await this.getBoxesByLength(8)).map((boxName) => decodeUint64(boxName.nameRaw, "bigint")); } /* - * Readers + * Registry Readers * * We simulate from a client configured with a (theoretically) known-good account on all networks, default dev fee sink */ - async getLabelDescriptor(labelId: string): Promise { - const { - returns: [labelDescriptorValue], - } = await wrapErrors( - this.readClient - .newGroup() - .getLabel({ args: { id: labelId }, boxReferences: [labelId] }) - .simulate(SIMULATE_PARAMS) - ); - - return { id: labelId, ...labelDescriptorValue! }; + async getLabelDescriptor(labelId: string): Promise { + try { + const { + returns: [labelDescriptorValue], + } = await wrapErrors( + this.readClient + .newGroup() + .getLabel({ args: { id: labelId }, boxReferences: [labelId] }) + .simulate(SIMULATE_PARAMS) + ); + return { id: labelId, ...labelDescriptorValue! }; + } catch (e) { + if ((e as Error).message === "ERR:NOEXIST") { + return null; + } else { + throw e; + } + } } async getLabelDescriptors(labelIds: string[]): Promise> { - const labels = await this.getBoxesByLength(2); - const { confirmations } = await wrapErrors( this.readClient .newGroup() @@ -106,17 +111,12 @@ export class AbelSDK { const logs = confirmations[0]!.logs ?? []; - // find a method that returns the same value as we are logging - const method = this.readClient.appClient.getABIMethod("get_label"); - const labelDescriptors: Map = new Map(); - logs.forEach((logValue: Uint8Array, idx) => { + const descriptorValues = this.parseLogsAs(logs, LabelDescriptorBoxValueFromTuple, "get_label"); + + descriptorValues.forEach((descriptorValue, idx) => { const id = labelIds[idx]; - const descriptorValue = LabelDescriptorBoxValueFromTuple( - // @ts-ignore TODO fixable? - method.returns.type.decode(logs[idx]) - ); labelDescriptors.set(id, { id, ...descriptorValue }); }); @@ -137,6 +137,7 @@ export class AbelSDK { } async getAssetLabels(assetId: bigint): Promise { + // TODO should this throw NONEXIST if it is not labelled?? const { returns: [assetLabels], } = await wrapErrors( @@ -149,6 +150,24 @@ export class AbelSDK { return assetLabels!; } + async getAssetsLabels(assetIds: bigint[]): Promise> { + const { + returns: [assetsLabels], + } = await wrapErrors( + this.readClient + .newGroup() + .getAssetsLabels({ args: { assets: assetIds }, boxReferences: assetIds.map((a) => encodeUint64(a)) }) + .simulate(SIMULATE_PARAMS) + ); + + const map: Map = new Map(); + assetsLabels?.forEach((assetLabels, idx) => { + map.set(assetIds[idx], assetLabels); + }); + + return map; + } + /* * Write methods = transactions */ @@ -228,4 +247,38 @@ export class AbelSDK { }); return wrapErrors(query); } + + /* Utils */ + + private async getBoxesByLength(length: number): Promise { + const boxNames = await this.readClient.algorand.app.getBoxNames(this.appId); + return boxNames.filter((boxName) => boxName.nameRaw.length === length); + } + + /* + * parse typed arc4 structs from logs + * + * tupleParser is like generated clients' xyzArcStructFromTuple + * abiDecodingMethod is a method name that returns the same avi return type as we are logging + * e.g. if we are parsing log_label_descriptors() logs that logs LabelDescriptor, abiDecodingMethod can be get_label_descriptor that has ABI return LabelDescriptor + */ + parseLogsAs(logs: Uint8Array[], tupleParser: T, abiDecodingMethodName: string): ReturnType[] { + const decodingMethod = this.readClient.appClient.getABIMethod(abiDecodingMethodName); + const parsed = logs.map((logValue) => + tupleParser( + // @ts-ignore TODO fixable? + decodingMethod.returns.type.decode(logValue) + ) + ); + return parsed; + } + + /* + * ts guard for write clients only + */ + requireWriteClient(): asserts this is this & { writeAccount: TransactionSignerAccount } & { writeClient: AssetLabelingClient } { + if (this.writeAccount === undefined || this.writeClient === undefined) { + throw new Error(`A transaction operation was issued on a read-only client`); + } + } } diff --git a/projects/abel-sdk-v2/src/types.ts b/projects/abel-sdk-v2/src/types.ts index d015dda..15d5ebb 100644 --- a/projects/abel-sdk-v2/src/types.ts +++ b/projects/abel-sdk-v2/src/types.ts @@ -6,3 +6,4 @@ export interface LabelDescriptor extends LabelDescriptorBoxValue { id: string; } +export type AnyFn = (...args: any[]) => any; diff --git a/projects/abel-sdk-v2/src/util.ts b/projects/abel-sdk-v2/src/util.ts index 7434517..e75bb40 100644 --- a/projects/abel-sdk-v2/src/util.ts +++ b/projects/abel-sdk-v2/src/util.ts @@ -1,4 +1,3 @@ - export async function wrapErrors(a: T) { try { return await a; diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map index 86ff3cc..7f96a3b 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map @@ -3,7 +3,7 @@ "sources": [ "../../asset_labeling/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCQ;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAwNK;;AAAA;AAAA;AAAA;;AAAA;AAxNL;;;AAAA;AAAA;;AAwNK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAtLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAsLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA1JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA0JK;;;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;AA5IL;;;AAAA;AAAA;;AA4IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AAnGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAmGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAvEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAuEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAxCL;;;AAwCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAnCL;;;AAAA;;;AAmCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA3BL;;;AAAA;;;AA2BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAhBL;;;AAAA;;;AAAA;;;AAAA;;;AAgBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAXL;;;AAAA;AAAA;;AAWK;;;AAAA;;AAXL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASe;;AAAc;AAAA;AAAA;AAAA;AAAd;AApBR;;;AAoBkC;;AAnBjC;AACA;;AAoBR;;;AAEQ;;;AACA;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9BR;;;AA8B+B;;AA7B9B;AACA;AA6BO;;AAAA;AAAmB;AAAnB;AA/BR;;;AA+B8B;;AA9B7B;AACA;AA+BI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AAzCR;;;AAyC2B;AAxC1B;AACA;AAwCO;;AAAA;AAAmB;AAAnB;AA1CR;;;AA0C8B;;AAzC7B;AACA;AAyCO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AA3CR;;;AA2CyC;;AA1CxC;AACA;AA0CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AAhDR;;;AAgD2B;AA/C1B;AACA;AA+CO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;AADC;AADJ;;;;AAnEL;;;AAsEK;;AArEJ;AACA;;;;;;AAuER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AArFR;;;AAqF8B;AApF7B;AACA;AAqFG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;AADH;AA1FT;;;AA4FS;;AA3FR;AACA;AA8Fe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAlHR;;;AAkH8B;AAjH7B;AACA;AAiHO;;AAAA;AAAA;;AAnHR;;;AAmHoC;AAlHnC;AACA;AAoHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AAxHL;;;AA2HK;AA1HJ;AACA;AA6HmB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAjIL;;;AAkIK;;AAjIJ;AACA;AAoII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEe;;AAAA;AAAA;;AAzJR;;;AAyJoC;AAxJnC;AACA;AAwJO;;AAAA;AAAA;AAAP;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AAvKR;;;AAuK8B;AAtK7B;AACA;AAuKA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;AAA5C;AA9KT;;;AA+KS;;AA9KR;AACA;AAiLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AAnMR;;;AAmM8B;AAlM7B;AACA;AAmMA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AA3MT;;AAAA;;;AA0Ne;AAzNd;AACA;AA2NmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEe;;AAAA;AAAA;AAAA;AAAA;;AArOR;;;AAqO8B;AApO7B;AACA;AAoOO;;AAAA;AAAA;AAAP;AAAA", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CQ;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAkOK;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUe;;AAAc;AAAA;AAAA;AAAA;AAAd;AA1BR;;;AA0BkC;;AAzBjC;AACA;;AA0BR;;;AAEQ;;;AACA;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AApCR;;;AAoC+B;;AAnC9B;AACA;AAmCO;;AAAA;AAAmB;AAAnB;AArCR;;;AAqC8B;;AApC7B;AACA;AAqCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA/CR;;;AA+C2B;AA9C1B;AACA;AA8CO;;AAAA;AAAmB;AAAnB;AAhDR;;;AAgD8B;;AA/C7B;AACA;AA+CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAjDR;;;AAiDyC;;AAhDxC;AACA;AAgDA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AAtDR;;;AAsD2B;AArD1B;AACA;AAqDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;AADC;AADJ;;;;AAzEL;;;AA4EK;;AA3EJ;AACA;;;;;;AA6ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA3FR;;;AA2F8B;AA1F7B;AACA;AA2FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;AADH;AAhGT;;;AAkGS;;AAjGR;AACA;AAoGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAxHR;;;AAwH8B;AAvH7B;AACA;AAuHO;;AAAA;AAAA;;AAzHR;;;AAyHoC;AAxHnC;AACA;AA0HA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA9HL;;;AAiIK;AAhIJ;AACA;AAmImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAvIL;;;AAwIK;;AAvIJ;AACA;AA0II;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAzJD;AA2JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA/KR;;;AA+K8B;AA9K7B;AACA;AA+KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;AAA5C;AAtLT;;;AAuLS;;AAtLR;AACA;AAyLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA3MR;;;AA2M8B;AA1M7B;AACA;AA2MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAnNT;;AAAA;;;AAkOe;AAjOd;AACA;AAmOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAvOD;AAyOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA", "op_pc_offset": 0, "pc_events": { "1": { @@ -14,7 +14,7 @@ "op": "intcblock 1 0 2 4294967295 4294967296" }, "16": { - "op": "bytecblock \"ERR:NOEXIST\" \"admin\" \"\" 0x151f7c75 \"ERR:EXISTS\" \"ERR:UNAUTH\" \"ERR:LENGTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0002 0x0001 0x0000" + "op": "bytecblock \"ERR:NOEXIST\" \"\" 0x0000 \"admin\" 0x151f7c75 \"ERR:EXISTS\" 0x0002 \"ERR:UNAUTH\" \"ERR:LENGTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0001" }, "105": { "op": "txn ApplicationID", @@ -30,7 +30,7 @@ "stack_out": [] }, "110": { - "op": "bytec_1 // \"admin\"", + "op": "bytec_3 // \"admin\"", "defined_out": [ "\"admin\"" ], @@ -65,17 +65,18 @@ ] }, "116": { - "op": "bz main_bare_routing@16", + "op": "bz main_bare_routing@17", "stack_out": [] }, "119": { - "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\"", + "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\"", "defined_out": [ "Method(add_label(string,string)void)", "Method(add_label_to_asset(string,asset)void)", "Method(add_operator_to_label(account,string)void)", "Method(change_admin(account)void)", "Method(get_asset_labels(asset)string[])", + "Method(get_assets_labels(uint64[])string[][])", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", "Method(log_labels(string[])void)", @@ -94,10 +95,11 @@ "Method(get_operator_labels(account)string[])", "Method(add_label_to_asset(string,asset)void)", "Method(remove_label_from_asset(string,asset)void)", - "Method(get_asset_labels(asset)string[])" + "Method(get_asset_labels(asset)string[])", + "Method(get_assets_labels(uint64[])string[][])" ] }, - "176": { + "181": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(add_label(string,string)void)", @@ -105,6 +107,7 @@ "Method(add_operator_to_label(account,string)void)", "Method(change_admin(account)void)", "Method(get_asset_labels(asset)string[])", + "Method(get_assets_labels(uint64[])string[][])", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", "Method(log_labels(string[])void)", @@ -125,15 +128,16 @@ "Method(add_label_to_asset(string,asset)void)", "Method(remove_label_from_asset(string,asset)void)", "Method(get_asset_labels(asset)string[])", + "Method(get_assets_labels(uint64[])string[][])", "tmp%2#0" ] }, - "179": { - "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15", + "184": { + "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16", "stack_out": [] }, - "203": { - "block": "main_after_if_else@18", + "210": { + "block": "main_after_if_else@19", "stack_in": [], "op": "intc_1 // 0", "defined_out": [ @@ -143,11 +147,113 @@ "tmp%0#0" ] }, - "204": { + "211": { + "op": "return", + "stack_out": [] + }, + "212": { + "block": "main_get_assets_labels_route@16", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%84#0" + ], + "stack_out": [ + "tmp%84#0" + ] + }, + "214": { + "op": "!", + "defined_out": [ + "tmp%85#0" + ], + "stack_out": [ + "tmp%85#0" + ] + }, + "215": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "216": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%86#0" + ], + "stack_out": [ + "tmp%86#0" + ] + }, + "218": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "219": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%88#0" + ], + "stack_out": [ + "tmp%88#0" + ] + }, + "222": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", + "op": "callsub get_assets_labels", + "defined_out": [ + "tmp%89#0" + ], + "stack_out": [ + "tmp%89#0" + ] + }, + "225": { + "op": "bytec 4 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%89#0" + ], + "stack_out": [ + "tmp%89#0", + "0x151f7c75" + ] + }, + "227": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%89#0" + ] + }, + "228": { + "op": "concat", + "defined_out": [ + "tmp%90#0" + ], + "stack_out": [ + "tmp%90#0" + ] + }, + "229": { + "op": "log", + "stack_out": [] + }, + "230": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "231": { "op": "return", "stack_out": [] }, - "205": { + "232": { "block": "main_get_asset_labels_route@15", "stack_in": [], "op": "txn OnCompletion", @@ -158,7 +264,7 @@ "tmp%76#0" ] }, - "207": { + "234": { "op": "!", "defined_out": [ "tmp%77#0" @@ -167,12 +273,12 @@ "tmp%77#0" ] }, - "208": { + "235": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "209": { + "236": { "op": "txn ApplicationID", "defined_out": [ "tmp%78#0" @@ -181,12 +287,12 @@ "tmp%78#0" ] }, - "211": { + "238": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "212": { + "239": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%6#0" @@ -195,7 +301,7 @@ "reinterpret_bytes[1]%6#0" ] }, - "215": { + "242": { "op": "btoi", "defined_out": [ "tmp%80#0" @@ -204,7 +310,7 @@ "tmp%80#0" ] }, - "216": { + "243": { "op": "txnas Assets", "defined_out": [ "tmp%81#0" @@ -213,7 +319,7 @@ "tmp%81#0" ] }, - "218": { + "245": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", "op": "callsub get_asset_labels", "defined_out": [ @@ -223,8 +329,8 @@ "tmp%82#0" ] }, - "221": { - "op": "bytec_3 // 0x151f7c75", + "248": { + "op": "bytec 4 // 0x151f7c75", "defined_out": [ "0x151f7c75", "tmp%82#0" @@ -234,14 +340,14 @@ "0x151f7c75" ] }, - "222": { + "250": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%82#0" ] }, - "223": { + "251": { "op": "concat", "defined_out": [ "tmp%83#0" @@ -250,11 +356,11 @@ "tmp%83#0" ] }, - "224": { + "252": { "op": "log", "stack_out": [] }, - "225": { + "253": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -263,11 +369,11 @@ "tmp%0#0" ] }, - "226": { + "254": { "op": "return", "stack_out": [] }, - "227": { + "255": { "block": "main_remove_label_from_asset_route@14", "stack_in": [], "op": "txn OnCompletion", @@ -278,7 +384,7 @@ "tmp%68#0" ] }, - "229": { + "257": { "op": "!", "defined_out": [ "tmp%69#0" @@ -287,12 +393,12 @@ "tmp%69#0" ] }, - "230": { + "258": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "231": { + "259": { "op": "txn ApplicationID", "defined_out": [ "tmp%70#0" @@ -301,12 +407,12 @@ "tmp%70#0" ] }, - "233": { + "261": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "234": { + "262": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%72#0" @@ -315,7 +421,7 @@ "tmp%72#0" ] }, - "237": { + "265": { "op": "extract 2 0", "defined_out": [ "tmp%73#0" @@ -324,7 +430,7 @@ "tmp%73#0" ] }, - "240": { + "268": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%5#0", @@ -335,7 +441,7 @@ "reinterpret_bytes[1]%5#0" ] }, - "243": { + "271": { "op": "btoi", "defined_out": [ "tmp%73#0", @@ -346,7 +452,7 @@ "tmp%74#0" ] }, - "244": { + "272": { "op": "txnas Assets", "defined_out": [ "tmp%73#0", @@ -357,12 +463,12 @@ "tmp%75#0" ] }, - "246": { + "274": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", "op": "callsub remove_label_from_asset", "stack_out": [] }, - "249": { + "277": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -371,11 +477,11 @@ "tmp%0#0" ] }, - "250": { + "278": { "op": "return", "stack_out": [] }, - "251": { + "279": { "block": "main_add_label_to_asset_route@13", "stack_in": [], "op": "txn OnCompletion", @@ -386,7 +492,7 @@ "tmp%60#0" ] }, - "253": { + "281": { "op": "!", "defined_out": [ "tmp%61#0" @@ -395,12 +501,12 @@ "tmp%61#0" ] }, - "254": { + "282": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "255": { + "283": { "op": "txn ApplicationID", "defined_out": [ "tmp%62#0" @@ -409,12 +515,12 @@ "tmp%62#0" ] }, - "257": { + "285": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "258": { + "286": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%64#0" @@ -423,7 +529,7 @@ "tmp%64#0" ] }, - "261": { + "289": { "op": "extract 2 0", "defined_out": [ "tmp%65#0" @@ -432,7 +538,7 @@ "tmp%65#0" ] }, - "264": { + "292": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%4#0", @@ -443,7 +549,7 @@ "reinterpret_bytes[1]%4#0" ] }, - "267": { + "295": { "op": "btoi", "defined_out": [ "tmp%65#0", @@ -454,7 +560,7 @@ "tmp%66#0" ] }, - "268": { + "296": { "op": "txnas Assets", "defined_out": [ "tmp%65#0", @@ -465,12 +571,12 @@ "tmp%67#0" ] }, - "270": { + "298": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", "op": "callsub add_label_to_asset", "stack_out": [] }, - "273": { + "301": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -479,11 +585,11 @@ "tmp%0#0" ] }, - "274": { + "302": { "op": "return", "stack_out": [] }, - "275": { + "303": { "block": "main_get_operator_labels_route@12", "stack_in": [], "op": "txn OnCompletion", @@ -494,7 +600,7 @@ "tmp%52#0" ] }, - "277": { + "305": { "op": "!", "defined_out": [ "tmp%53#0" @@ -503,12 +609,12 @@ "tmp%53#0" ] }, - "278": { + "306": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "279": { + "307": { "op": "txn ApplicationID", "defined_out": [ "tmp%54#0" @@ -517,12 +623,12 @@ "tmp%54#0" ] }, - "281": { + "309": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "282": { + "310": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%3#0" @@ -531,7 +637,7 @@ "reinterpret_bytes[1]%3#0" ] }, - "285": { + "313": { "op": "btoi", "defined_out": [ "tmp%56#0" @@ -540,7 +646,7 @@ "tmp%56#0" ] }, - "286": { + "314": { "op": "txnas Accounts", "defined_out": [ "tmp%57#0" @@ -549,7 +655,7 @@ "tmp%57#0" ] }, - "288": { + "316": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", "op": "callsub get_operator_labels", "defined_out": [ @@ -559,8 +665,8 @@ "tmp%58#0" ] }, - "291": { - "op": "bytec_3 // 0x151f7c75", + "319": { + "op": "bytec 4 // 0x151f7c75", "defined_out": [ "0x151f7c75", "tmp%58#0" @@ -570,14 +676,14 @@ "0x151f7c75" ] }, - "292": { + "321": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%58#0" ] }, - "293": { + "322": { "op": "concat", "defined_out": [ "tmp%59#0" @@ -586,11 +692,11 @@ "tmp%59#0" ] }, - "294": { + "323": { "op": "log", "stack_out": [] }, - "295": { + "324": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -599,11 +705,11 @@ "tmp%0#0" ] }, - "296": { + "325": { "op": "return", "stack_out": [] }, - "297": { + "326": { "block": "main_remove_operator_from_label_route@11", "stack_in": [], "op": "txn OnCompletion", @@ -614,7 +720,7 @@ "tmp%44#0" ] }, - "299": { + "328": { "op": "!", "defined_out": [ "tmp%45#0" @@ -623,12 +729,12 @@ "tmp%45#0" ] }, - "300": { + "329": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "301": { + "330": { "op": "txn ApplicationID", "defined_out": [ "tmp%46#0" @@ -637,12 +743,12 @@ "tmp%46#0" ] }, - "303": { + "332": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "304": { + "333": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%2#0" @@ -651,7 +757,7 @@ "reinterpret_bytes[1]%2#0" ] }, - "307": { + "336": { "op": "btoi", "defined_out": [ "tmp%48#0" @@ -660,7 +766,7 @@ "tmp%48#0" ] }, - "308": { + "337": { "op": "txnas Accounts", "defined_out": [ "tmp%49#0" @@ -669,7 +775,7 @@ "tmp%49#0" ] }, - "310": { + "339": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%49#0", @@ -680,7 +786,7 @@ "tmp%50#0" ] }, - "313": { + "342": { "op": "extract 2 0", "defined_out": [ "tmp%49#0", @@ -691,12 +797,12 @@ "tmp%51#0" ] }, - "316": { + "345": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", "op": "callsub remove_operator_from_label", "stack_out": [] }, - "319": { + "348": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -705,11 +811,11 @@ "tmp%0#0" ] }, - "320": { + "349": { "op": "return", "stack_out": [] }, - "321": { + "350": { "block": "main_add_operator_to_label_route@10", "stack_in": [], "op": "txn OnCompletion", @@ -720,7 +826,7 @@ "tmp%36#0" ] }, - "323": { + "352": { "op": "!", "defined_out": [ "tmp%37#0" @@ -729,12 +835,12 @@ "tmp%37#0" ] }, - "324": { + "353": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "325": { + "354": { "op": "txn ApplicationID", "defined_out": [ "tmp%38#0" @@ -743,12 +849,12 @@ "tmp%38#0" ] }, - "327": { + "356": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "328": { + "357": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%1#0" @@ -757,7 +863,7 @@ "reinterpret_bytes[1]%1#0" ] }, - "331": { + "360": { "op": "btoi", "defined_out": [ "tmp%40#0" @@ -766,7 +872,7 @@ "tmp%40#0" ] }, - "332": { + "361": { "op": "txnas Accounts", "defined_out": [ "tmp%41#0" @@ -775,7 +881,7 @@ "tmp%41#0" ] }, - "334": { + "363": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%41#0", @@ -786,7 +892,7 @@ "tmp%42#0" ] }, - "337": { + "366": { "op": "extract 2 0", "defined_out": [ "tmp%41#0", @@ -797,12 +903,12 @@ "tmp%43#0" ] }, - "340": { + "369": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", "op": "callsub add_operator_to_label", "stack_out": [] }, - "343": { + "372": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -811,11 +917,11 @@ "tmp%0#0" ] }, - "344": { + "373": { "op": "return", "stack_out": [] }, - "345": { + "374": { "block": "main_log_labels_route@9", "stack_in": [], "op": "txn OnCompletion", @@ -826,7 +932,7 @@ "tmp%31#0" ] }, - "347": { + "376": { "op": "!", "defined_out": [ "tmp%32#0" @@ -835,12 +941,12 @@ "tmp%32#0" ] }, - "348": { + "377": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "349": { + "378": { "op": "txn ApplicationID", "defined_out": [ "tmp%33#0" @@ -849,12 +955,12 @@ "tmp%33#0" ] }, - "351": { + "380": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "352": { + "381": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%35#0" @@ -863,12 +969,12 @@ "tmp%35#0" ] }, - "355": { + "384": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", "op": "callsub log_labels", "stack_out": [] }, - "358": { + "387": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -877,11 +983,11 @@ "tmp%0#0" ] }, - "359": { + "388": { "op": "return", "stack_out": [] }, - "360": { + "389": { "block": "main_get_label_route@8", "stack_in": [], "op": "txn OnCompletion", @@ -892,7 +998,7 @@ "tmp%23#0" ] }, - "362": { + "391": { "op": "!", "defined_out": [ "tmp%24#0" @@ -901,12 +1007,12 @@ "tmp%24#0" ] }, - "363": { + "392": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "364": { + "393": { "op": "txn ApplicationID", "defined_out": [ "tmp%25#0" @@ -915,12 +1021,12 @@ "tmp%25#0" ] }, - "366": { + "395": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "367": { + "396": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%27#0" @@ -929,7 +1035,7 @@ "tmp%27#0" ] }, - "370": { + "399": { "op": "extract 2 0", "defined_out": [ "tmp%28#0" @@ -938,7 +1044,7 @@ "tmp%28#0" ] }, - "373": { + "402": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "op": "callsub get_label", "defined_out": [ @@ -948,8 +1054,8 @@ "tmp%29#0" ] }, - "376": { - "op": "bytec_3 // 0x151f7c75", + "405": { + "op": "bytec 4 // 0x151f7c75", "defined_out": [ "0x151f7c75", "tmp%29#0" @@ -959,14 +1065,14 @@ "0x151f7c75" ] }, - "377": { + "407": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%29#0" ] }, - "378": { + "408": { "op": "concat", "defined_out": [ "tmp%30#0" @@ -975,11 +1081,11 @@ "tmp%30#0" ] }, - "379": { + "409": { "op": "log", "stack_out": [] }, - "380": { + "410": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -988,11 +1094,11 @@ "tmp%0#0" ] }, - "381": { + "411": { "op": "return", "stack_out": [] }, - "382": { + "412": { "block": "main_remove_label_route@7", "stack_in": [], "op": "txn OnCompletion", @@ -1003,7 +1109,7 @@ "tmp%17#0" ] }, - "384": { + "414": { "op": "!", "defined_out": [ "tmp%18#0" @@ -1012,12 +1118,12 @@ "tmp%18#0" ] }, - "385": { + "415": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "386": { + "416": { "op": "txn ApplicationID", "defined_out": [ "tmp%19#0" @@ -1026,12 +1132,12 @@ "tmp%19#0" ] }, - "388": { + "418": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "389": { + "419": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%21#0" @@ -1040,7 +1146,7 @@ "tmp%21#0" ] }, - "392": { + "422": { "op": "extract 2 0", "defined_out": [ "tmp%22#0" @@ -1049,12 +1155,12 @@ "tmp%22#0" ] }, - "395": { + "425": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "op": "callsub remove_label", "stack_out": [] }, - "398": { + "428": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1063,11 +1169,11 @@ "tmp%0#0" ] }, - "399": { + "429": { "op": "return", "stack_out": [] }, - "400": { + "430": { "block": "main_add_label_route@6", "stack_in": [], "op": "txn OnCompletion", @@ -1078,7 +1184,7 @@ "tmp%9#0" ] }, - "402": { + "432": { "op": "!", "defined_out": [ "tmp%10#0" @@ -1087,12 +1193,12 @@ "tmp%10#0" ] }, - "403": { + "433": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "404": { + "434": { "op": "txn ApplicationID", "defined_out": [ "tmp%11#0" @@ -1101,12 +1207,12 @@ "tmp%11#0" ] }, - "406": { + "436": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "407": { + "437": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%13#0" @@ -1115,7 +1221,7 @@ "tmp%13#0" ] }, - "410": { + "440": { "op": "extract 2 0", "defined_out": [ "tmp%14#0" @@ -1124,7 +1230,7 @@ "tmp%14#0" ] }, - "413": { + "443": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%14#0", @@ -1135,7 +1241,7 @@ "tmp%15#0" ] }, - "416": { + "446": { "op": "extract 2 0", "defined_out": [ "tmp%14#0", @@ -1146,12 +1252,12 @@ "tmp%16#0" ] }, - "419": { + "449": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", "op": "callsub add_label", "stack_out": [] }, - "422": { + "452": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1160,11 +1266,11 @@ "tmp%0#0" ] }, - "423": { + "453": { "op": "return", "stack_out": [] }, - "424": { + "454": { "block": "main_change_admin_route@5", "stack_in": [], "op": "txn OnCompletion", @@ -1175,7 +1281,7 @@ "tmp%3#0" ] }, - "426": { + "456": { "op": "!", "defined_out": [ "tmp%4#0" @@ -1184,12 +1290,12 @@ "tmp%4#0" ] }, - "427": { + "457": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "428": { + "458": { "op": "txn ApplicationID", "defined_out": [ "tmp%5#0" @@ -1198,12 +1304,12 @@ "tmp%5#0" ] }, - "430": { + "460": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "431": { + "461": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%0#0" @@ -1212,7 +1318,7 @@ "reinterpret_bytes[1]%0#0" ] }, - "434": { + "464": { "op": "btoi", "defined_out": [ "tmp%7#0" @@ -1221,7 +1327,7 @@ "tmp%7#0" ] }, - "435": { + "465": { "op": "txnas Accounts", "defined_out": [ "tmp%8#0" @@ -1230,12 +1336,12 @@ "tmp%8#0" ] }, - "437": { + "467": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", "op": "callsub change_admin", "stack_out": [] }, - "440": { + "470": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1244,49 +1350,49 @@ "tmp%0#0" ] }, - "441": { + "471": { "op": "return", "stack_out": [] }, - "442": { - "block": "main_bare_routing@16", + "472": { + "block": "main_bare_routing@17", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%84#0" + "tmp%91#0" ], "stack_out": [ - "tmp%84#0" + "tmp%91#0" ] }, - "444": { - "op": "bnz main_after_if_else@18", + "474": { + "op": "bnz main_after_if_else@19", "stack_out": [] }, - "447": { + "477": { "op": "txn ApplicationID", "defined_out": [ - "tmp%85#0" + "tmp%92#0" ], "stack_out": [ - "tmp%85#0" + "tmp%92#0" ] }, - "449": { + "479": { "op": "!", "defined_out": [ - "tmp%86#0" + "tmp%93#0" ], "stack_out": [ - "tmp%86#0" + "tmp%93#0" ] }, - "450": { + "480": { "error": "can only call when creating", "op": "assert // can only call when creating", "stack_out": [] }, - "451": { + "481": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1295,11 +1401,11 @@ "tmp%0#0" ] }, - "452": { + "482": { "op": "return", "stack_out": [] }, - "453": { + "483": { "subroutine": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "params": { "array#0": "bytes", @@ -1310,7 +1416,7 @@ "stack_in": [], "op": "proto 3 1" }, - "456": { + "486": { "op": "frame_dig -3", "defined_out": [ "array#0 (copy)" @@ -1319,7 +1425,7 @@ "array#0 (copy)" ] }, - "458": { + "488": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -1330,7 +1436,7 @@ "0" ] }, - "459": { + "489": { "op": "extract_uint16", "defined_out": [ "array_length#0" @@ -1339,7 +1445,7 @@ "array_length#0" ] }, - "460": { + "490": { "op": "dup", "defined_out": [ "array_length#0", @@ -1350,7 +1456,7 @@ "array_length#0 (copy)" ] }, - "461": { + "491": { "op": "frame_dig -1", "defined_out": [ "array_length#0", @@ -1363,7 +1469,7 @@ "new_items_count#0 (copy)" ] }, - "463": { + "493": { "op": "+", "defined_out": [ "array_length#0", @@ -1374,14 +1480,14 @@ "new_length#0" ] }, - "464": { + "494": { "op": "swap", "stack_out": [ "new_length#0", "array_length#0" ] }, - "465": { + "495": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -1394,7 +1500,7 @@ "2" ] }, - "466": { + "496": { "op": "*", "defined_out": [ "new_length#0", @@ -1405,7 +1511,7 @@ "tmp%0#0" ] }, - "467": { + "497": { "op": "intc_2 // 2", "stack_out": [ "new_length#0", @@ -1413,7 +1519,7 @@ "2" ] }, - "468": { + "498": { "op": "+", "defined_out": [ "header_end#0", @@ -1424,7 +1530,7 @@ "header_end#0" ] }, - "469": { + "499": { "op": "dig 1", "defined_out": [ "header_end#0", @@ -1437,7 +1543,7 @@ "new_length#0 (copy)" ] }, - "471": { + "501": { "op": "itob", "defined_out": [ "header_end#0", @@ -1450,7 +1556,7 @@ "tmp%1#0" ] }, - "472": { + "502": { "op": "extract 6 2", "defined_out": [ "header_end#0", @@ -1463,7 +1569,7 @@ "tmp%2#0" ] }, - "475": { + "505": { "op": "cover 2", "defined_out": [ "header_end#0", @@ -1476,7 +1582,7 @@ "header_end#0" ] }, - "477": { + "507": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1485,7 +1591,7 @@ "array#0 (copy)" ] }, - "479": { + "509": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1495,7 +1601,7 @@ "2" ] }, - "480": { + "510": { "op": "dig 2", "defined_out": [ "2", @@ -1514,7 +1620,7 @@ "header_end#0 (copy)" ] }, - "482": { + "512": { "op": "substring3", "defined_out": [ "header_end#0", @@ -1529,7 +1635,7 @@ "tmp%3#0" ] }, - "483": { + "513": { "op": "frame_dig -1", "stack_out": [ "tmp%2#0", @@ -1539,7 +1645,7 @@ "new_items_count#0 (copy)" ] }, - "485": { + "515": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1550,7 +1656,7 @@ "2" ] }, - "486": { + "516": { "op": "*", "defined_out": [ "header_end#0", @@ -1567,7 +1673,7 @@ "tmp%4#0" ] }, - "487": { + "517": { "op": "bzero", "defined_out": [ "header_end#0", @@ -1584,7 +1690,7 @@ "tmp%5#0" ] }, - "488": { + "518": { "op": "concat", "defined_out": [ "header_end#0", @@ -1599,7 +1705,7 @@ "tmp%6#0" ] }, - "489": { + "519": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1609,7 +1715,7 @@ "array#0 (copy)" ] }, - "491": { + "521": { "op": "len", "defined_out": [ "header_end#0", @@ -1626,7 +1732,7 @@ "tmp%7#0" ] }, - "492": { + "522": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1637,7 +1743,7 @@ "array#0 (copy)" ] }, - "494": { + "524": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -1648,7 +1754,7 @@ "header_end#0" ] }, - "496": { + "526": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -1659,7 +1765,7 @@ "tmp%7#0" ] }, - "498": { + "528": { "op": "substring3", "defined_out": [ "new_length#0", @@ -1674,7 +1780,7 @@ "tmp%8#0" ] }, - "499": { + "529": { "op": "concat", "defined_out": [ "new_length#0", @@ -1687,7 +1793,7 @@ "tmp%9#0" ] }, - "500": { + "530": { "op": "frame_dig -2", "defined_out": [ "new_items_bytes#0 (copy)", @@ -1702,7 +1808,7 @@ "new_items_bytes#0 (copy)" ] }, - "502": { + "532": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -1715,7 +1821,7 @@ "array_head_and_tail#0" ] }, - "503": { + "533": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -1728,7 +1834,7 @@ "new_length#0" ] }, - "504": { + "534": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1737,7 +1843,7 @@ "2" ] }, - "505": { + "535": { "op": "*", "defined_out": [ "array_head_and_tail#0", @@ -1750,7 +1856,7 @@ "tail_offset#0" ] }, - "506": { + "536": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -1764,7 +1870,7 @@ "tail_offset#0" ] }, - "507": { + "537": { "op": "intc_1 // 0", "defined_out": [ "array_head_and_tail#0", @@ -1780,7 +1886,7 @@ "head_offset#0" ] }, - "508": { + "538": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -1797,7 +1903,7 @@ "tail_offset#1" ] }, - "509": { + "539": { "block": "dynamic_array_concat_byte_length_head_for_header@2", "stack_in": [ "tmp%2#0", @@ -1819,7 +1925,7 @@ "head_offset#0" ] }, - "511": { + "541": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -1835,7 +1941,7 @@ "tail_offset#0" ] }, - "513": { + "543": { "op": "<", "defined_out": [ "continue_looping%0#0", @@ -1851,7 +1957,7 @@ "continue_looping%0#0" ] }, - "514": { + "544": { "op": "bz dynamic_array_concat_byte_length_head_after_for@5", "stack_out": [ "tmp%2#0", @@ -1861,7 +1967,7 @@ "tail_offset#1" ] }, - "517": { + "547": { "op": "frame_dig 4", "defined_out": [ "head_offset#0", @@ -1877,7 +1983,7 @@ "tail_offset#1" ] }, - "519": { + "549": { "op": "dup", "defined_out": [ "head_offset#0", @@ -1895,7 +2001,7 @@ "tail_offset#1 (copy)" ] }, - "520": { + "550": { "op": "itob", "defined_out": [ "head_offset#0", @@ -1913,7 +2019,7 @@ "tmp%5#0" ] }, - "521": { + "551": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -1931,7 +2037,7 @@ "tail_offset_bytes#0" ] }, - "524": { + "554": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -1951,7 +2057,7 @@ "array_head_and_tail#0" ] }, - "526": { + "556": { "op": "frame_dig 3", "stack_out": [ "tmp%2#0", @@ -1965,7 +2071,7 @@ "head_offset#0" ] }, - "528": { + "558": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -1988,7 +2094,7 @@ "head_offset#0 (copy)" ] }, - "529": { + "559": { "op": "cover 4", "stack_out": [ "tmp%2#0", @@ -2003,7 +2109,7 @@ "head_offset#0 (copy)" ] }, - "531": { + "561": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -2018,7 +2124,7 @@ "tail_offset_bytes#0" ] }, - "533": { + "563": { "op": "replace3", "stack_out": [ "tmp%2#0", @@ -2031,7 +2137,7 @@ "array_head_and_tail#0" ] }, - "534": { + "564": { "op": "dup", "stack_out": [ "tmp%2#0", @@ -2045,7 +2151,7 @@ "array_head_and_tail#0" ] }, - "535": { + "565": { "op": "frame_bury 1", "defined_out": [ "array_head_and_tail#0", @@ -2064,7 +2170,7 @@ "array_head_and_tail#0" ] }, - "537": { + "567": { "op": "dig 1", "stack_out": [ "tmp%2#0", @@ -2078,7 +2184,7 @@ "tail_offset#1 (copy)" ] }, - "539": { + "569": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail#0", @@ -2098,7 +2204,7 @@ "tmp%6#1" ] }, - "540": { + "570": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2120,7 +2226,7 @@ "2" ] }, - "541": { + "571": { "op": "+", "defined_out": [ "array_head_and_tail#0", @@ -2140,7 +2246,7 @@ "tmp%7#0" ] }, - "542": { + "572": { "op": "+", "stack_out": [ "tmp%2#0", @@ -2152,7 +2258,7 @@ "tail_offset#1" ] }, - "543": { + "573": { "op": "frame_bury 4", "defined_out": [ "array_head_and_tail#0", @@ -2169,7 +2275,7 @@ "head_offset#0" ] }, - "545": { + "575": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -2181,7 +2287,7 @@ "2" ] }, - "546": { + "576": { "op": "+", "stack_out": [ "tmp%2#0", @@ -2192,7 +2298,7 @@ "head_offset#0" ] }, - "547": { + "577": { "op": "frame_bury 3", "stack_out": [ "tmp%2#0", @@ -2202,10 +2308,10 @@ "tail_offset#1" ] }, - "549": { + "579": { "op": "b dynamic_array_concat_byte_length_head_for_header@2" }, - "552": { + "582": { "block": "dynamic_array_concat_byte_length_head_after_for@5", "stack_in": [ "tmp%2#0", @@ -2227,7 +2333,7 @@ "tmp%2#0" ] }, - "554": { + "584": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -2243,7 +2349,7 @@ "array_head_and_tail#0" ] }, - "556": { + "586": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -2259,1257 +2365,1639 @@ "tmp%12#0" ] }, - "557": { + "587": { "op": "frame_bury 0" }, - "559": { + "589": { "retsub": true, "op": "retsub" }, - "560": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "params": {}, - "block": "admin_only", + "590": { + "subroutine": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", + "params": { + "array_items_count#0": "uint64", + "array_head_and_tail#0": "bytes", + "new_items_count#0": "uint64", + "new_head_and_tail#0": "bytes" + }, + "block": "dynamic_array_concat_dynamic_element", "stack_in": [], - "op": "txn Sender", + "op": "proto 4 1" + }, + "593": { + "op": "bytec_1 // \"\"", + "stack_out": [ + "item_offset_adjustment#2" + ] + }, + "594": { + "op": "dup" + }, + "595": { + "op": "frame_dig -2" + }, + "597": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "new_head#0", + "new_items_count#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "new_items_count#0 (copy)", + "2" + ] + }, + "598": { + "op": "*", + "defined_out": [ + "item_offset_adjustment#0", + "new_head#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0" + ] + }, + "599": { + "op": "frame_dig -4", + "defined_out": [ + "array_items_count#0 (copy)", + "item_offset_adjustment#0", + "new_head#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "array_items_count#0 (copy)" + ] + }, + "601": { + "op": "intc_2 // 2", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "array_items_count#0 (copy)", + "2" + ] + }, + "602": { + "op": "*", "defined_out": [ + "item_offset_adjustment#0", + "new_head#0", "tmp%0#0" ], "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", "tmp%0#0" ] }, - "562": { + "603": { "op": "intc_1 // 0", "defined_out": [ - "0", + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", "tmp%0#0" ], "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", "tmp%0#0", - "0" + "head_offset#0" ] }, - "563": { - "op": "bytec_1 // \"admin\"", + "604": { + "block": "dynamic_array_concat_dynamic_element_for_header@1", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig 4", "defined_out": [ - "\"admin\"", - "0", + "head_offset#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "606": { + "op": "frame_dig 3", + "defined_out": [ + "head_offset#0", "tmp%0#0" ], "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", "tmp%0#0", - "0", - "\"admin\"" + "head_offset#0", + "head_offset#0", + "tmp%0#0" ] }, - "564": { - "op": "app_global_get_ex", + "608": { + "op": "<", "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", + "continue_looping%0#0", + "head_offset#0", "tmp%0#0" ], "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" + "head_offset#0", + "continue_looping%0#0" ] }, - "565": { - "error": "check self.admin exists", - "op": "assert // check self.admin exists", + "609": { + "op": "bz dynamic_array_concat_dynamic_element_after_for@4", "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", "tmp%0#0", - "maybe_value%0#0" + "head_offset#0" ] }, - "566": { - "op": "==", + "612": { + "op": "frame_dig -3", "defined_out": [ - "cond#0" + "array_head_and_tail#0 (copy)", + "head_offset#0", + "tmp%0#0" ], "stack_out": [ - "cond#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)" ] }, - "567": { - "op": "bnz admin_only_after_if_else@3", - "stack_out": [] + "614": { + "op": "frame_dig 4", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)", + "head_offset#0" + ] }, - "570": { - "op": "bytec 5 // \"ERR:UNAUTH\"", + "616": { + "op": "dup", "defined_out": [ - "\"ERR:UNAUTH\"" + "array_head_and_tail#0 (copy)", + "head_offset#0", + "head_offset#0 (copy)", + "tmp%0#0" ], "stack_out": [ - "\"ERR:UNAUTH\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)", + "head_offset#0 (copy)", + "head_offset#0 (copy)" ] }, - "572": { - "op": "log", - "stack_out": [] - }, - "573": { - "op": "err" - }, - "574": { - "block": "admin_only_after_if_else@3", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "575": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", - "params": { - "new_admin#0": "bytes" - }, - "block": "change_admin", - "stack_in": [], - "op": "proto 1 0" - }, - "578": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "op": "callsub admin_only" - }, - "581": { - "op": "bytec_1 // \"admin\"", - "defined_out": [ - "\"admin\"" - ], + "617": { + "op": "cover 2", "stack_out": [ - "\"admin\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "array_head_and_tail#0 (copy)", + "head_offset#0 (copy)" ] }, - "582": { - "op": "frame_dig -1", + "619": { + "op": "extract_uint16", "defined_out": [ - "\"admin\"", - "new_admin#0 (copy)" + "head_offset#0", + "item_offset#0", + "tmp%0#0" ], "stack_out": [ - "\"admin\"", - "new_admin#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0" ] }, - "584": { - "op": "app_global_put", - "stack_out": [] - }, - "585": { - "retsub": true, - "op": "retsub" - }, - "586": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", - "params": { - "id#0": "bytes", - "name#0": "bytes" - }, - "block": "add_label", - "stack_in": [], - "op": "proto 2 0" - }, - "589": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "op": "callsub admin_only" - }, - "592": { - "op": "frame_dig -2", + "620": { + "op": "frame_dig 2", "defined_out": [ - "id#0 (copy)" + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0", + "tmp%0#0" ], "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0" ] }, - "594": { - "op": "box_len", + "622": { + "op": "+", "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" + "head_offset#0", + "item_offset_adjustment#0", + "tmp%0#0", + "tmp%1#0" ], "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%1#0" ] }, - "595": { - "op": "bury 1", + "623": { + "op": "itob", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "tmp%0#0", + "tmp%2#0" + ], "stack_out": [ - "maybe_exists%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%2#0" ] }, - "597": { - "op": "bz add_label_after_if_else@3", - "stack_out": [] - }, - "600": { - "op": "bytec 4 // \"ERR:EXISTS\"", + "624": { + "op": "extract 6 2", "defined_out": [ - "\"ERR:EXISTS\"" + "head_offset#0", + "item_offset_adjustment#0", + "tmp%0#0", + "tmp%3#0" ], "stack_out": [ - "\"ERR:EXISTS\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%3#0" ] }, - "602": { - "op": "log", - "stack_out": [] - }, - "603": { - "op": "err" - }, - "604": { - "block": "add_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -2", + "627": { + "op": "frame_dig 1", "defined_out": [ - "id#0 (copy)" + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0", + "tmp%3#0" ], "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%3#0", + "new_head#0" ] }, - "606": { - "op": "len", + "629": { + "op": "swap", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0", + "tmp%3#0" + ] + }, + "630": { + "op": "concat", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0" + ] + }, + "631": { + "op": "frame_bury 1", "defined_out": [ - "tmp%2#0" + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" ], "stack_out": [ - "tmp%2#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" ] }, - "607": { + "633": { "op": "intc_2 // 2", "defined_out": [ "2", - "tmp%2#0" + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" ], "stack_out": [ - "tmp%2#0", + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", "2" ] }, - "608": { - "op": "==", - "defined_out": [ - "cond#1" - ], + "634": { + "op": "+", "stack_out": [ - "cond#1" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" ] }, - "609": { - "op": "bnz add_label_after_if_else@7", - "stack_out": [] - }, - "612": { - "op": "bytec 6 // \"ERR:LENGTH\"", + "635": { + "op": "frame_bury 4", "defined_out": [ - "\"ERR:LENGTH\"" + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" ], "stack_out": [ - "\"ERR:LENGTH\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" ] }, - "614": { - "op": "log", - "stack_out": [] - }, - "615": { - "op": "err" + "637": { + "op": "b dynamic_array_concat_dynamic_element_for_header@1" }, - "616": { - "block": "add_label_after_if_else@7", - "stack_in": [], - "op": "frame_dig -1", + "640": { + "block": "dynamic_array_concat_dynamic_element_after_for@4", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig -3", "defined_out": [ - "name#0 (copy)" + "array_head_and_tail#0 (copy)" ], "stack_out": [ - "name#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)" ] }, - "618": { + "642": { "op": "len", "defined_out": [ - "length%0#0" + "item_offset_adjustment#2" ], "stack_out": [ - "length%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "item_offset_adjustment#2" ] }, - "619": { - "op": "itob", + "643": { + "op": "frame_bury 0", "defined_out": [ - "as_bytes%0#0" + "item_offset_adjustment#2" ], "stack_out": [ - "as_bytes%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" ] }, - "620": { - "op": "extract 6 2", + "645": { + "op": "intc_1 // 0", "defined_out": [ - "length_uint16%0#0" + "head_offset#0", + "item_offset_adjustment#2" ], "stack_out": [ - "length_uint16%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" ] }, - "623": { - "op": "frame_dig -1", + "646": { + "op": "frame_bury 4", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#2" + ], "stack_out": [ - "length_uint16%0#0", - "name#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" ] }, - "625": { - "op": "concat", + "648": { + "block": "dynamic_array_concat_dynamic_element_for_header@5", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig 4", "defined_out": [ - "encoded_value%0#0" + "head_offset#0" ], "stack_out": [ - "encoded_value%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" ] }, - "626": { - "op": "pushbytes 0x001200000000000000000000000000000000", + "650": { + "op": "frame_dig 2", "defined_out": [ - "0x001200000000000000000000000000000000", - "encoded_value%0#0" + "head_offset#0", + "item_offset_adjustment#0" ], "stack_out": [ - "encoded_value%0#0", - "0x001200000000000000000000000000000000" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset_adjustment#0" ] }, - "646": { - "op": "swap", + "652": { + "op": "<", + "defined_out": [ + "continue_looping%1#0", + "head_offset#0", + "item_offset_adjustment#0" + ], "stack_out": [ - "0x001200000000000000000000000000000000", - "encoded_value%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "continue_looping%1#0" ] }, - "647": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%4#0" - ], + "653": { + "op": "bz dynamic_array_concat_dynamic_element_after_for@8", "stack_out": [ - "encoded_tuple_buffer%4#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" ] }, - "648": { - "op": "frame_dig -2", + "656": { + "op": "frame_dig -1", "defined_out": [ - "encoded_tuple_buffer%4#0", - "id#0 (copy)" + "head_offset#0", + "item_offset_adjustment#0", + "new_head_and_tail#0 (copy)" ], "stack_out": [ - "encoded_tuple_buffer%4#0", - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "new_head_and_tail#0 (copy)" ] }, - "650": { - "op": "box_del", - "defined_out": [ - "encoded_tuple_buffer%4#0", - "{box_del}" - ], + "658": { + "op": "frame_dig 4", "stack_out": [ - "encoded_tuple_buffer%4#0", - "{box_del}" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "new_head_and_tail#0 (copy)", + "head_offset#0" ] }, - "651": { - "op": "pop", + "660": { + "op": "dup", + "defined_out": [ + "head_offset#0", + "head_offset#0 (copy)", + "item_offset_adjustment#0", + "new_head_and_tail#0 (copy)" + ], "stack_out": [ - "encoded_tuple_buffer%4#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "new_head_and_tail#0 (copy)", + "head_offset#0 (copy)", + "head_offset#0 (copy)" ] }, - "652": { - "op": "frame_dig -2", + "661": { + "op": "cover 2", "stack_out": [ - "encoded_tuple_buffer%4#0", - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head_and_tail#0 (copy)", + "head_offset#0 (copy)" ] }, - "654": { - "op": "swap", + "663": { + "op": "extract_uint16", + "defined_out": [ + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0" + ], "stack_out": [ - "id#0 (copy)", - "encoded_tuple_buffer%4#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0" ] }, - "655": { - "op": "box_put", - "stack_out": [] - }, - "656": { - "retsub": true, - "op": "retsub" - }, - "657": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", - "params": { - "id#0": "bytes" - }, - "block": "remove_label", - "stack_in": [], - "op": "proto 1 0" - }, - "660": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "op": "callsub admin_only" - }, - "663": { - "op": "frame_dig -1", + "664": { + "op": "frame_dig 0", "defined_out": [ - "id#0 (copy)" + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2" ], "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#2" ] }, - "665": { - "op": "box_len", + "666": { + "op": "+", "defined_out": [ - "cond#0", - "maybe_value%0#0" + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "tmp%5#0" ], "stack_out": [ - "maybe_value%0#0", - "cond#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%5#0" ] }, - "666": { - "op": "bury 1", + "667": { + "op": "itob", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "tmp%6#0" + ], "stack_out": [ - "cond#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%6#0" ] }, "668": { - "op": "bnz remove_label_after_if_else@3", - "stack_out": [] + "op": "extract 6 2", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "tmp%7#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%7#0" + ] }, "671": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "op": "frame_dig 1", "defined_out": [ - "\"ERR:NOEXIST\"" + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "tmp%7#0" ], "stack_out": [ - "\"ERR:NOEXIST\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%7#0", + "new_head#0" ] }, - "672": { - "op": "log", - "stack_out": [] - }, "673": { - "op": "err" + "op": "swap", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0", + "tmp%7#0" + ] }, "674": { - "block": "remove_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], + "op": "concat", "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0" ] }, - "676": { - "op": "len", + "675": { + "op": "frame_bury 1", "defined_out": [ - "tmp%1#0" + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0" ], "stack_out": [ - "tmp%1#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" ] }, "677": { "op": "intc_2 // 2", "defined_out": [ "2", - "tmp%1#0" + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0" ], "stack_out": [ - "tmp%1#0", + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", "2" ] }, "678": { - "op": "==", - "defined_out": [ - "cond#0" - ], + "op": "+", "stack_out": [ - "cond#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" ] }, "679": { - "op": "bnz remove_label_after_if_else@7", - "stack_out": [] - }, - "682": { - "op": "bytec 6 // \"ERR:LENGTH\"", + "op": "frame_bury 4", "defined_out": [ - "\"ERR:LENGTH\"" + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0" ], "stack_out": [ - "\"ERR:LENGTH\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" ] }, - "684": { - "op": "log", - "stack_out": [] + "681": { + "op": "b dynamic_array_concat_dynamic_element_for_header@5" }, - "685": { - "op": "err" + "684": { + "block": "dynamic_array_concat_dynamic_element_after_for@8", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig -4", + "defined_out": [ + "array_items_count#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_items_count#0 (copy)" + ] }, "686": { - "block": "remove_label_after_if_else@7", - "stack_in": [], - "op": "frame_dig -1", + "op": "frame_dig -2", "defined_out": [ - "id#0 (copy)" + "array_items_count#0 (copy)", + "new_items_count#0 (copy)" ], "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_items_count#0 (copy)", + "new_items_count#0 (copy)" ] }, "688": { - "op": "box_get", + "op": "+", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" + "tmp%8#0" ], "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%8#0" ] }, "689": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", + "op": "itob", + "defined_out": [ + "tmp%9#0" + ], "stack_out": [ - "maybe_value%1#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%9#0" ] }, "690": { - "error": "Index access is out of bounds", - "op": "extract 2 8 // on error: Index access is out of bounds", + "op": "extract 6 2", "defined_out": [ - "reinterpret_biguint%0#0" + "tmp%10#0" ], "stack_out": [ - "reinterpret_biguint%0#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%10#0" ] }, "693": { - "op": "bytec 7 // 0x0000000000000000", + "op": "frame_dig 1", "defined_out": [ - "0x0000000000000000", - "reinterpret_biguint%0#0" + "new_head#0", + "tmp%10#0" ], "stack_out": [ - "reinterpret_biguint%0#0", - "0x0000000000000000" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%10#0", + "new_head#0" ] }, "695": { - "op": "b==", + "op": "concat", "defined_out": [ - "cond#0" + "new_head#0", + "tmp%11#0" ], "stack_out": [ - "cond#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0" ] }, "696": { - "op": "bnz remove_label_after_if_else@11", - "stack_out": [] - }, - "699": { - "op": "bytec 8 // \"ERR:NOEMPTY\"", + "op": "frame_dig -3", "defined_out": [ - "\"ERR:NOEMPTY\"" + "array_head_and_tail#0 (copy)", + "new_head#0", + "tmp%11#0" ], "stack_out": [ - "\"ERR:NOEMPTY\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "array_head_and_tail#0 (copy)" ] }, - "701": { - "op": "log", - "stack_out": [] - }, - "702": { - "op": "err" - }, - "703": { - "block": "remove_label_after_if_else@11", - "stack_in": [], - "op": "frame_dig -1", + "698": { + "op": "frame_dig 3", "defined_out": [ - "id#0 (copy)" + "array_head_and_tail#0 (copy)", + "new_head#0", + "tmp%0#0", + "tmp%11#0" ], "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "array_head_and_tail#0 (copy)", + "tmp%0#0" ] }, - "705": { - "op": "box_del", + "700": { + "op": "frame_dig 0", "defined_out": [ - "{box_del}" + "array_head_and_tail#0 (copy)", + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%11#0" ], "stack_out": [ - "{box_del}" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "array_head_and_tail#0 (copy)", + "tmp%0#0", + "item_offset_adjustment#2" ] }, - "706": { - "op": "pop", - "stack_out": [] - }, - "707": { - "retsub": true, - "op": "retsub" + "702": { + "op": "substring3", + "defined_out": [ + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%11#0", + "tmp%14#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "tmp%14#0" + ] }, - "708": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", - "params": { - "id#0": "bytes" - }, - "block": "get_label", - "stack_in": [], - "op": "proto 1 1" + "703": { + "op": "concat", + "defined_out": [ + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%15#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0" + ] }, - "711": { + "704": { "op": "frame_dig -1", "defined_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "new_head_and_tail#0 (copy)", + "tmp%0#0", + "tmp%15#0" ], "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "new_head_and_tail#0 (copy)" ] }, - "713": { - "op": "box_len", + "706": { + "op": "len", "defined_out": [ - "cond#0", - "maybe_value%0#0" + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%15#0", + "tmp%17#0" ], "stack_out": [ - "maybe_value%0#0", - "cond#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%17#0" ] }, - "714": { - "op": "bury 1", + "707": { + "op": "frame_dig -1", "stack_out": [ - "cond#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%17#0", + "new_head_and_tail#0 (copy)" ] }, - "716": { - "op": "bnz get_label_after_if_else@3", - "stack_out": [] - }, - "719": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "709": { + "op": "frame_dig 2", "defined_out": [ - "\"ERR:NOEXIST\"" + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "new_head_and_tail#0 (copy)", + "tmp%0#0", + "tmp%15#0", + "tmp%17#0" ], "stack_out": [ - "\"ERR:NOEXIST\"" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%17#0", + "new_head_and_tail#0 (copy)", + "item_offset_adjustment#0" ] }, - "720": { - "op": "log", - "stack_out": [] - }, - "721": { - "op": "err" + "711": { + "op": "uncover 2", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "new_head_and_tail#0 (copy)", + "item_offset_adjustment#0", + "tmp%17#0" + ] }, - "722": { - "block": "get_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", + "713": { + "op": "substring3", "defined_out": [ - "id#0 (copy)" + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%15#0", + "tmp%18#0" ], "stack_out": [ - "id#0 (copy)" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%18#0" ] }, - "724": { - "op": "box_get", + "714": { + "op": "concat", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%19#0" ], "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%19#0" ] }, - "725": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "maybe_value%1#0" - ] + "715": { + "op": "frame_bury 0" }, - "726": { + "717": { "retsub": true, "op": "retsub" }, - "727": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", - "params": { - "ids#0": "bytes" - }, - "block": "log_labels", + "718": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "params": {}, + "block": "admin_only", "stack_in": [], - "op": "proto 1 0" - }, - "730": { - "op": "frame_dig -1", + "op": "txn Sender", "defined_out": [ - "ids#0 (copy)" + "tmp%0#0" ], "stack_out": [ - "ids#0 (copy)" + "tmp%0#0" ] }, - "732": { + "720": { "op": "intc_1 // 0", "defined_out": [ "0", - "ids#0 (copy)" + "tmp%0#0" ], "stack_out": [ - "ids#0 (copy)", + "tmp%0#0", "0" ] }, - "733": { - "op": "extract_uint16", + "721": { + "op": "bytec_3 // \"admin\"", "defined_out": [ - "array_length%0#0" + "\"admin\"", + "0", + "tmp%0#0" ], "stack_out": [ - "array_length%0#0" + "tmp%0#0", + "0", + "\"admin\"" ] }, - "734": { - "op": "intc_1 // 0", + "722": { + "op": "app_global_get_ex", "defined_out": [ - "_idx#0", - "array_length%0#0" + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" ], "stack_out": [ - "array_length%0#0", - "_idx#0" + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" ] }, - "735": { - "block": "log_labels_for_header@1", - "stack_in": [ - "array_length%0#0", - "_idx#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "_idx#0" - ], + "723": { + "error": "check self.admin exists", + "op": "assert // check self.admin exists", "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0" + "tmp%0#0", + "maybe_value%0#0" ] }, - "737": { - "op": "frame_dig 0", + "724": { + "op": "==", "defined_out": [ - "_idx#0", - "array_length%0#0" + "cond#0" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_length%0#0" + "cond#0" ] }, - "739": { - "op": "<", + "725": { + "op": "bnz admin_only_after_if_else@3", + "stack_out": [] + }, + "728": { + "op": "bytec 7 // \"ERR:UNAUTH\"", "defined_out": [ - "_idx#0", - "array_length%0#0", - "continue_looping%0#0" + "\"ERR:UNAUTH\"" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "continue_looping%0#0" + "\"ERR:UNAUTH\"" ] }, - "740": { - "op": "bz log_labels_after_for@4", - "stack_out": [ - "array_length%0#0", - "_idx#0" - ] + "730": { + "op": "log", + "stack_out": [] }, - "743": { - "op": "frame_dig -1", - "defined_out": [ - "_idx#0", - "array_length%0#0", - "ids#0 (copy)" + "731": { + "op": "err" + }, + "732": { + "block": "admin_only_after_if_else@3", + "stack_in": [], + "retsub": true, + "op": "retsub" + }, + "733": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", + "params": { + "new_admin#0": "bytes" + }, + "block": "change_admin", + "stack_in": [], + "op": "proto 1 0" + }, + "736": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" + }, + "739": { + "op": "bytec_3 // \"admin\"", + "defined_out": [ + "\"admin\"" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "ids#0 (copy)" + "\"admin\"" ] }, - "745": { - "op": "extract 2 0", + "740": { + "op": "frame_dig -1", "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0" + "\"admin\"", + "new_admin#0 (copy)" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "array_head_and_tail%0#0" + "\"admin\"", + "new_admin#0 (copy)" ] }, - "748": { - "op": "frame_dig 1", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0" - ] + "742": { + "op": "app_global_put", + "stack_out": [] + }, + "743": { + "retsub": true, + "op": "retsub" + }, + "744": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", + "params": { + "id#0": "bytes", + "name#0": "bytes" + }, + "block": "add_label", + "stack_in": [], + "op": "proto 2 0" + }, + "747": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" }, "750": { - "op": "dup", + "op": "frame_dig -2", "defined_out": [ - "_idx#0", - "_idx#0 (copy)", - "array_head_and_tail%0#0", - "array_length%0#0" + "id#0 (copy)" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0 (copy)", - "_idx#0 (copy)" + "id#0 (copy)" ] }, - "751": { - "op": "cover 2", + "752": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0 (copy)" + "maybe_value%0#0", + "maybe_exists%0#0" ] }, "753": { - "op": "intc_2 // 2", + "op": "bury 1", + "stack_out": [ + "maybe_exists%0#0" + ] + }, + "755": { + "op": "bz add_label_after_if_else@3", + "stack_out": [] + }, + "758": { + "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ - "2", - "_idx#0", - "_idx#0 (copy)", - "array_head_and_tail%0#0", - "array_length%0#0" + "\"ERR:EXISTS\"" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0 (copy)", - "2" + "\"ERR:EXISTS\"" ] }, - "754": { - "op": "*", + "760": { + "op": "log", + "stack_out": [] + }, + "761": { + "op": "err" + }, + "762": { + "block": "add_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -2", "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_offset_offset%0#0" + "id#0 (copy)" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0" + "id#0 (copy)" ] }, - "755": { - "op": "dig 1", + "764": { + "op": "len", "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "item_offset_offset%0#0" + "tmp%2#0" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0", - "array_head_and_tail%0#0 (copy)" + "tmp%2#0" ] }, - "757": { - "op": "swap", + "765": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "tmp%2#0" + ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset_offset%0#0" + "tmp%2#0", + "2" ] }, - "758": { - "op": "extract_uint16", + "766": { + "op": "==", "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_offset%0#0" + "cond#1" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" + "cond#1" ] }, - "759": { - "op": "dup2", + "767": { + "op": "bnz add_label_after_if_else@7", + "stack_out": [] + }, + "770": { + "op": "bytec 8 // \"ERR:LENGTH\"", "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "item_offset%0#0", - "item_offset%0#0 (copy)" + "\"ERR:LENGTH\"" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" + "\"ERR:LENGTH\"" ] }, - "760": { - "op": "extract_uint16", + "772": { + "op": "log", + "stack_out": [] + }, + "773": { + "op": "err" + }, + "774": { + "block": "add_label_after_if_else@7", + "stack_in": [], + "op": "frame_dig -1", "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_length%0#0", - "item_offset%0#0" + "name#0 (copy)" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" + "name#0 (copy)" ] }, - "761": { - "op": "intc_2 // 2", + "776": { + "op": "len", + "defined_out": [ + "length%0#0" + ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" + "length%0#0" ] }, - "762": { - "op": "+", + "777": { + "op": "itob", "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_head_tail_length%0#0", - "item_offset%0#0" + "as_bytes%0#0" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" + "as_bytes%0#0" ] }, - "763": { - "op": "extract3", + "778": { + "op": "extract 6 2", "defined_out": [ - "_idx#0", - "array_length%0#0", - "label_id#0" + "length_uint16%0#0" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "label_id#0" + "length_uint16%0#0" ] }, - "764": { - "op": "extract 2 0", - "defined_out": [ - "_idx#0", - "array_length%0#0", - "tmp%0#0" - ], + "781": { + "op": "frame_dig -1", "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "tmp%0#0" + "length_uint16%0#0", + "name#0 (copy)" ] }, - "767": { - "op": "box_get", + "783": { + "op": "concat", "defined_out": [ - "_idx#0", - "array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" + "encoded_value%0#0" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" + "encoded_value%0#0" ] }, - "768": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", + "784": { + "op": "pushbytes 0x001200000000000000000000000000000000", + "defined_out": [ + "0x001200000000000000000000000000000000", + "encoded_value%0#0" + ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "maybe_value%0#0" + "encoded_value%0#0", + "0x001200000000000000000000000000000000" ] }, - "769": { - "op": "log", + "804": { + "op": "swap", "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0" + "0x001200000000000000000000000000000000", + "encoded_value%0#0" ] }, - "770": { - "op": "intc_0 // 1", + "805": { + "op": "concat", "defined_out": [ - "1", - "_idx#0", - "array_length%0#0" + "encoded_tuple_buffer%4#0" ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "1" + "encoded_tuple_buffer%4#0" ] }, - "771": { - "op": "+", + "806": { + "op": "frame_dig -2", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "id#0 (copy)" + ], "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0" + "encoded_tuple_buffer%4#0", + "id#0 (copy)" ] }, - "772": { - "op": "frame_bury 1", + "808": { + "op": "box_del", "defined_out": [ - "_idx#0", - "array_length%0#0" + "encoded_tuple_buffer%4#0", + "{box_del}" ], "stack_out": [ - "array_length%0#0", - "_idx#0" + "encoded_tuple_buffer%4#0", + "{box_del}" ] }, - "774": { - "op": "b log_labels_for_header@1" + "809": { + "op": "pop", + "stack_out": [ + "encoded_tuple_buffer%4#0" + ] }, - "777": { - "block": "log_labels_after_for@4", - "stack_in": [ - "array_length%0#0", - "_idx#0" - ], + "810": { + "op": "frame_dig -2", + "stack_out": [ + "encoded_tuple_buffer%4#0", + "id#0 (copy)" + ] + }, + "812": { + "op": "swap", + "stack_out": [ + "id#0 (copy)", + "encoded_tuple_buffer%4#0" + ] + }, + "813": { + "op": "box_put", + "stack_out": [] + }, + "814": { "retsub": true, "op": "retsub" }, - "778": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", + "815": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "params": { - "label#0": "bytes" + "id#0": "bytes" }, - "block": "admin_or_operator_only", + "block": "remove_label", "stack_in": [], "op": "proto 1 0" }, - "781": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "783": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] + "818": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" }, - "784": { - "op": "bytec_1 // \"admin\"", + "821": { + "op": "frame_dig -1", "defined_out": [ - "\"admin\"", - "0", - "tmp%0#0" + "id#0 (copy)" ], "stack_out": [ - "tmp%0#0", - "0", - "\"admin\"" + "id#0 (copy)" ] }, - "785": { - "op": "app_global_get_ex", + "823": { + "op": "box_len", "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" + "cond#0", + "maybe_value%0#0" ], "stack_out": [ - "tmp%0#0", "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "786": { - "error": "check self.admin exists", - "op": "assert // check self.admin exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" + "cond#0" ] }, - "787": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], + "824": { + "op": "bury 1", "stack_out": [ - "tmp%1#0" + "cond#0" ] }, - "788": { - "op": "bz admin_or_operator_only_after_if_else@2", + "826": { + "op": "bnz remove_label_after_if_else@3", "stack_out": [] }, - "791": { - "retsub": true, - "op": "retsub" - }, - "792": { - "block": "admin_or_operator_only_after_if_else@2", - "stack_in": [], - "op": "frame_dig -1", + "829": { + "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ - "label#0 (copy)" + "\"ERR:NOEXIST\"" ], "stack_out": [ - "label#0 (copy)" + "\"ERR:NOEXIST\"" ] }, - "794": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "op": "callsub operator_only", + "830": { + "op": "log", "stack_out": [] }, - "797": { - "retsub": true, - "op": "retsub" + "831": { + "op": "err" }, - "798": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "params": { - "label#0": "bytes" - }, - "block": "operator_only", + "832": { + "block": "remove_label_after_if_else@3", "stack_in": [], - "op": "proto 1 0" - }, - "801": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "803": { "op": "frame_dig -1", "defined_out": [ - "label#0 (copy)", - "tmp%0#0" + "id#0 (copy)" ], "stack_out": [ - "tmp%0#0", - "label#0 (copy)" + "id#0 (copy)" ] }, - "805": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", + "834": { + "op": "len", "defined_out": [ "tmp%1#0" ], @@ -3517,82 +4005,98 @@ "tmp%1#0" ] }, - "808": { - "op": "intc 4 // 4294967296", + "835": { + "op": "intc_2 // 2", "defined_out": [ - "4294967296", + "2", "tmp%1#0" ], "stack_out": [ "tmp%1#0", - "4294967296" + "2" ] }, - "810": { - "op": "!=", + "836": { + "op": "==", "defined_out": [ - "tmp%2#0" + "cond#0" ], "stack_out": [ - "tmp%2#0" + "cond#0" ] }, - "811": { - "op": "bz operator_only_bool_false@3", + "837": { + "op": "bnz remove_label_after_if_else@7", "stack_out": [] }, - "814": { - "op": "txn Sender", + "840": { + "op": "bytec 8 // \"ERR:LENGTH\"", "defined_out": [ - "tmp%3#0" + "\"ERR:LENGTH\"" ], "stack_out": [ - "tmp%3#0" + "\"ERR:LENGTH\"" ] }, - "816": { + "842": { + "op": "log", + "stack_out": [] + }, + "843": { + "op": "err" + }, + "844": { + "block": "remove_label_after_if_else@7", + "stack_in": [], "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], "stack_out": [ - "tmp%3#0", - "label#0 (copy)" + "id#0 (copy)" ] }, - "818": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", + "846": { + "op": "box_get", "defined_out": [ - "tmp%4#0" + "maybe_exists%1#0", + "maybe_value%1#0" ], "stack_out": [ - "tmp%4#0" + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "821": { - "op": "intc_3 // 4294967295", + "847": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "848": { + "error": "Index access is out of bounds", + "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ - "4294967295", - "tmp%4#0" + "reinterpret_biguint%0#0" ], "stack_out": [ - "tmp%4#0", - "4294967295" + "reinterpret_biguint%0#0" ] }, - "822": { - "op": "!=", + "851": { + "op": "bytec 9 // 0x0000000000000000", "defined_out": [ - "tmp%5#0" + "0x0000000000000000", + "reinterpret_biguint%0#0" ], "stack_out": [ - "tmp%5#0" + "reinterpret_biguint%0#0", + "0x0000000000000000" ] }, - "823": { - "op": "bz operator_only_bool_false@3", - "stack_out": [] - }, - "826": { - "op": "intc_0 // 1", + "853": { + "op": "b==", "defined_out": [ "cond#0" ], @@ -3600,2320 +4104,1838 @@ "cond#0" ] }, - "827": { - "block": "operator_only_bool_merge@4", - "stack_in": [ - "cond#0" - ], - "op": "bnz operator_only_after_if_else@7", - "defined_out": [], + "854": { + "op": "bnz remove_label_after_if_else@11", "stack_out": [] }, - "830": { - "op": "bytec 5 // \"ERR:UNAUTH\"", + "857": { + "op": "bytec 10 // \"ERR:NOEMPTY\"", "defined_out": [ - "\"ERR:UNAUTH\"" + "\"ERR:NOEMPTY\"" ], "stack_out": [ - "\"ERR:UNAUTH\"" + "\"ERR:NOEMPTY\"" ] }, - "832": { + "859": { "op": "log", "stack_out": [] }, - "833": { + "860": { "op": "err" }, - "834": { - "block": "operator_only_after_if_else@7", + "861": { + "block": "remove_label_after_if_else@11", "stack_in": [], - "retsub": true, - "op": "retsub" + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] }, - "835": { - "block": "operator_only_bool_false@3", - "stack_in": [], - "op": "intc_1 // 0", + "863": { + "op": "box_del", "defined_out": [ - "cond#0" + "{box_del}" ], "stack_out": [ - "cond#0" + "{box_del}" ] }, - "836": { - "op": "b operator_only_bool_merge@4" + "864": { + "op": "pop", + "stack_out": [] }, - "839": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "865": { + "retsub": true, + "op": "retsub" + }, + "866": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "params": { - "operator#0": "bytes", - "label#0": "bytes" + "id#0": "bytes" }, - "block": "get_operator_label_index", + "block": "get_label", "stack_in": [], - "op": "proto 2 1" - }, - "842": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%1#0" - ] - }, - "843": { - "op": "bytec_2 // \"\"", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0" - ] - }, - "844": { - "op": "dup", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] + "op": "proto 1 1" }, - "845": { - "op": "frame_dig -2", + "869": { + "op": "frame_dig -1", "defined_out": [ - "operator#0 (copy)" + "id#0 (copy)" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "operator#0 (copy)" + "id#0 (copy)" ] }, - "847": { + "871": { "op": "box_len", "defined_out": [ - "maybe_exists%0#0", + "cond#0", "maybe_value%0#0" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", "maybe_value%0#0", - "maybe_exists%0#0" + "cond#0" ] }, - "848": { + "872": { "op": "bury 1", "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%0#0" + "cond#0" ] }, - "850": { - "op": "bnz get_operator_label_index_after_if_else@2", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] + "874": { + "op": "bnz get_label_after_if_else@3", + "stack_out": [] }, - "853": { - "op": "intc 4 // 4294967296", + "877": { + "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ - "4294967296" + "\"ERR:NOEXIST\"" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "4294967296" + "\"ERR:NOEXIST\"" ] }, - "855": { - "op": "frame_bury 0" + "878": { + "op": "log", + "stack_out": [] }, - "857": { - "retsub": true, - "op": "retsub" + "879": { + "op": "err" }, - "858": { - "block": "get_operator_label_index_after_if_else@2", - "stack_in": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig -2", + "880": { + "block": "get_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -1", "defined_out": [ - "operator#0 (copy)" + "id#0 (copy)" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "operator#0 (copy)" + "id#0 (copy)" ] }, - "860": { + "882": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", "maybe_value%1#0" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", "maybe_value%1#0", "maybe_exists%1#0" ] }, - "861": { - "op": "swap", + "883": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0", "maybe_value%1#0" ] }, - "862": { - "op": "dup", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "maybe_value%1#0 (copy)" - ] - }, - "863": { - "op": "cover 2", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ] + "884": { + "retsub": true, + "op": "retsub" }, - "865": { - "op": "frame_bury 0", + "885": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", + "params": { + "ids#0": "bytes" + }, + "block": "log_labels", + "stack_in": [], + "op": "proto 1 0" + }, + "888": { + "op": "frame_dig -1", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" + "ids#0 (copy)" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "867": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0" + "ids#0 (copy)" ] }, - "868": { + "890": { "op": "intc_1 // 0", + "defined_out": [ + "0", + "ids#0 (copy)" + ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", + "ids#0 (copy)", "0" ] }, - "869": { + "891": { "op": "extract_uint16", "defined_out": [ - "array_length%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", "array_length%0#0" - ] - }, - "870": { - "op": "frame_bury 1", - "defined_out": [ - "array_length%0#0", - "maybe_value%1#0" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" + "array_length%0#0" ] }, - "872": { + "892": { "op": "intc_1 // 0", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "873": { - "op": "frame_bury 2", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0" + "_idx#0", + "array_length%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0" + "_idx#0" ] }, - "875": { - "block": "get_operator_label_index_for_header@3", + "893": { + "block": "log_labels_for_header@1", "stack_in": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0" + "_idx#0" ], - "op": "frame_dig 2", + "op": "frame_dig 1", "defined_out": [ - "idx#0" + "_idx#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "idx#0" + "_idx#0", + "_idx#0" ] }, - "877": { - "op": "frame_dig 1", + "895": { + "op": "frame_dig 0", "defined_out": [ - "array_length%0#0", - "idx#0" + "_idx#0", + "array_length%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "idx#0", + "_idx#0", + "_idx#0", "array_length%0#0" ] }, - "879": { + "897": { "op": "<", "defined_out": [ + "_idx#0", "array_length%0#0", - "continue_looping%0#0", - "idx#0" + "continue_looping%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", "continue_looping%0#0" ] }, - "880": { - "op": "bz get_operator_label_index_after_for@8", + "898": { + "op": "bz log_labels_after_for@4", "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0" + "_idx#0" ] }, - "883": { - "op": "frame_dig 0", + "901": { + "op": "frame_dig -1", "defined_out": [ + "_idx#0", "array_length%0#0", - "idx#0", - "maybe_value%1#0" + "ids#0 (copy)" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "maybe_value%1#0" + "_idx#0", + "ids#0 (copy)" ] }, - "885": { + "903": { "op": "extract 2 0", "defined_out": [ + "_idx#0", "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0" + "array_length%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", "array_head_and_tail%0#0" ] }, - "888": { - "op": "frame_dig 2", + "906": { + "op": "frame_dig 1", "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", "array_head_and_tail%0#0", - "idx#0" + "_idx#0" ] }, - "890": { + "908": { + "op": "dup", + "defined_out": [ + "_idx#0", + "_idx#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)", + "_idx#0 (copy)" + ] + }, + "909": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)" + ] + }, + "911": { "op": "intc_2 // 2", "defined_out": [ "2", + "_idx#0", + "_idx#0 (copy)", "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0" + "array_length%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", - "idx#0", + "_idx#0 (copy)", "2" ] }, - "891": { + "912": { "op": "*", "defined_out": [ + "_idx#0", "array_head_and_tail%0#0", "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#0" + "item_offset_offset%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", "item_offset_offset%0#0" ] }, - "892": { + "913": { "op": "dig 1", "defined_out": [ + "_idx#0", "array_head_and_tail%0#0", "array_head_and_tail%0#0 (copy)", "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#0" + "item_offset_offset%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", "item_offset_offset%0#0", "array_head_and_tail%0#0 (copy)" ] }, - "894": { + "915": { "op": "swap", "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", "array_head_and_tail%0#0 (copy)", "item_offset_offset%0#0" ] }, - "895": { + "916": { "op": "extract_uint16", "defined_out": [ + "_idx#0", "array_head_and_tail%0#0", "array_length%0#0", - "idx#0", - "item_offset%0#0", - "maybe_value%1#0" + "item_offset%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", "item_offset%0#0" ] }, - "896": { + "917": { "op": "dup2", "defined_out": [ + "_idx#0", "array_head_and_tail%0#0", "array_head_and_tail%0#0 (copy)", "array_length%0#0", - "idx#0", "item_offset%0#0", - "item_offset%0#0 (copy)", - "maybe_value%1#0" + "item_offset%0#0 (copy)" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", "item_offset%0#0", "array_head_and_tail%0#0 (copy)", "item_offset%0#0 (copy)" ] }, - "897": { + "918": { "op": "extract_uint16", "defined_out": [ + "_idx#0", "array_head_and_tail%0#0", "array_length%0#0", - "idx#0", "item_length%0#0", - "item_offset%0#0", - "maybe_value%1#0" + "item_offset%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", "item_offset%0#0", "item_length%0#0" ] }, - "898": { + "919": { "op": "intc_2 // 2", "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", "item_offset%0#0", "item_length%0#0", "2" ] }, - "899": { + "920": { "op": "+", "defined_out": [ + "_idx#0", "array_head_and_tail%0#0", "array_length%0#0", - "idx#0", "item_head_tail_length%0#0", - "item_offset%0#0", - "maybe_value%1#0" + "item_offset%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", + "_idx#0", + "_idx#0", "array_head_and_tail%0#0", "item_offset%0#0", "item_head_tail_length%0#0" ] }, - "900": { + "921": { "op": "extract3", "defined_out": [ + "_idx#0", "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "stored_label#0" + "label_id#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "stored_label#0" + "_idx#0", + "_idx#0", + "label_id#0" ] }, - "901": { + "922": { "op": "extract 2 0", "defined_out": [ + "_idx#0", "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "tmp%2#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "tmp%2#0" - ] - }, - "904": { - "op": "frame_dig -1", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label#0 (copy)", - "maybe_value%1#0", - "tmp%2#0" + "tmp%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "tmp%2#0", - "label#0 (copy)" + "_idx#0", + "_idx#0", + "tmp%0#0" ] }, - "906": { - "op": "==", + "925": { + "op": "box_get", "defined_out": [ + "_idx#0", "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "tmp%3#0" + "maybe_exists%0#0", + "maybe_value%0#0" ], "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0" - ] - }, - "907": { - "op": "bz get_operator_label_index_after_if_else@6", - "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0" + "_idx#0", + "_idx#0", + "maybe_value%0#0", + "maybe_exists%0#0" ] }, - "910": { - "op": "frame_dig 2", + "926": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "idx#0" + "_idx#0", + "_idx#0", + "maybe_value%0#0" ] }, - "912": { - "op": "frame_bury 0" - }, - "914": { - "retsub": true, - "op": "retsub" - }, - "915": { - "block": "get_operator_label_index_after_if_else@6", - "stack_in": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], + "927": { + "op": "log", "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "idx#0" + "_idx#0", + "_idx#0" ] }, - "917": { + "928": { "op": "intc_0 // 1", "defined_out": [ "1", - "idx#0" + "_idx#0", + "array_length%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "idx#0", + "_idx#0", + "_idx#0", "1" ] }, - "918": { + "929": { "op": "+", "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0", - "idx#0" + "_idx#0", + "_idx#0" ] }, - "919": { - "op": "frame_bury 2", + "930": { + "op": "frame_bury 1", "defined_out": [ - "idx#0" + "_idx#0", + "array_length%0#0" ], "stack_out": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0" + "_idx#0" ] }, - "921": { - "op": "b get_operator_label_index_for_header@3" + "932": { + "op": "b log_labels_for_header@1" }, - "924": { - "block": "get_operator_label_index_after_for@8", + "935": { + "block": "log_labels_after_for@4", "stack_in": [ - "maybe_value%1#0", "array_length%0#0", - "idx#0" - ], - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295" + "_idx#0" ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "4294967295" - ] - }, - "925": { - "op": "frame_bury 0" - }, - "927": { "retsub": true, "op": "retsub" }, - "928": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", + "936": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "params": { - "operator#0": "bytes", "label#0": "bytes" }, - "block": "add_operator_to_label", + "block": "admin_or_operator_only", "stack_in": [], - "op": "proto 2 0" + "op": "proto 1 0" }, - "931": { - "op": "frame_dig -1", + "939": { + "op": "txn Sender", "defined_out": [ - "label#0 (copy)" + "tmp%0#0" ], "stack_out": [ - "label#0 (copy)" + "tmp%0#0" ] }, - "933": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", - "op": "callsub admin_or_operator_only", - "stack_out": [] - }, - "936": { - "op": "frame_dig -1", + "941": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], "stack_out": [ - "label#0 (copy)" + "tmp%0#0", + "0" ] }, - "938": { - "op": "box_len", + "942": { + "op": "bytec_3 // \"admin\"", "defined_out": [ - "cond#0", - "maybe_value%0#0" + "\"admin\"", + "0", + "tmp%0#0" ], "stack_out": [ - "maybe_value%0#0", - "cond#0" + "tmp%0#0", + "0", + "\"admin\"" ] }, - "939": { - "op": "bury 1", + "943": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], "stack_out": [ - "cond#0" + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" ] }, - "941": { - "op": "bnz add_operator_to_label_after_if_else@10", - "stack_out": [] - }, "944": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], + "error": "check self.admin exists", + "op": "assert // check self.admin exists", "stack_out": [ - "\"ERR:NOEXIST\"" + "tmp%0#0", + "maybe_value%0#0" ] }, "945": { - "op": "log", - "stack_out": [] - }, - "946": { - "op": "err" - }, - "947": { - "block": "add_operator_to_label_after_if_else@10", - "stack_in": [], - "op": "frame_dig -2", + "op": "==", "defined_out": [ - "operator#0 (copy)" + "tmp%1#0" ], "stack_out": [ - "operator#0 (copy)" + "tmp%1#0" ] }, + "946": { + "op": "bz admin_or_operator_only_after_if_else@2", + "stack_out": [] + }, "949": { - "op": "box_len", + "retsub": true, + "op": "retsub" + }, + "950": { + "block": "admin_or_operator_only_after_if_else@2", + "stack_in": [], + "op": "frame_dig -1", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" + "label#0 (copy)" ], "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "950": { - "op": "bury 1", - "stack_out": [ - "maybe_exists%1#0" + "label#0 (copy)" ] }, "952": { - "op": "bz add_operator_to_label_else_body@2", + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "op": "callsub operator_only", "stack_out": [] }, "955": { - "op": "frame_dig -2", + "retsub": true, + "op": "retsub" + }, + "956": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "params": { + "label#0": "bytes" + }, + "block": "operator_only", + "stack_in": [], + "op": "proto 1 0" + }, + "959": { + "op": "txn Sender", + "defined_out": [ + "tmp%0#0" + ], "stack_out": [ - "operator#0 (copy)" + "tmp%0#0" ] }, - "957": { + "961": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", - "operator#0 (copy)" + "tmp%0#0" ], "stack_out": [ - "operator#0 (copy)", + "tmp%0#0", "label#0 (copy)" ] }, - "959": { + "963": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "962": { - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295", - "tmp%2#0" + "tmp%1#0" ], "stack_out": [ - "tmp%2#0", - "4294967295" + "tmp%1#0" ] }, - "963": { - "op": "==", + "966": { + "op": "intc 4 // 4294967296", "defined_out": [ - "cond#0" + "4294967296", + "tmp%1#0" ], "stack_out": [ - "cond#0" + "tmp%1#0", + "4294967296" ] }, - "964": { - "op": "bnz add_operator_to_label_after_if_else@6", - "stack_out": [] - }, - "967": { - "op": "bytec 4 // \"ERR:EXISTS\"", + "968": { + "op": "!=", "defined_out": [ - "\"ERR:EXISTS\"" + "tmp%2#0" ], "stack_out": [ - "\"ERR:EXISTS\"" + "tmp%2#0" ] }, "969": { - "op": "log", + "op": "bz operator_only_bool_false@3", "stack_out": [] }, - "970": { - "op": "err" - }, - "971": { - "block": "add_operator_to_label_after_if_else@6", - "stack_in": [], - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "operator#0 (copy)" - ] - }, - "973": { - "op": "box_get", + "972": { + "op": "txn Sender", "defined_out": [ - "existing#0", - "maybe_exists%2#0" + "tmp%3#0" ], "stack_out": [ - "existing#0", - "maybe_exists%2#0" + "tmp%3#0" ] }, "974": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", - "stack_out": [ - "existing#0" - ] - }, - "975": { "op": "frame_dig -1", - "defined_out": [ - "existing#0", - "label#0 (copy)" - ], "stack_out": [ - "existing#0", + "tmp%3#0", "label#0 (copy)" ] }, - "977": { - "op": "len", + "976": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "op": "callsub get_operator_label_index", "defined_out": [ - "existing#0", - "length%0#0" + "tmp%4#0" ], "stack_out": [ - "existing#0", - "length%0#0" + "tmp%4#0" ] }, - "978": { - "op": "itob", + "979": { + "op": "intc_3 // 4294967295", "defined_out": [ - "as_bytes%0#0", - "existing#0" + "4294967295", + "tmp%4#0" ], "stack_out": [ - "existing#0", - "as_bytes%0#0" + "tmp%4#0", + "4294967295" ] }, - "979": { - "op": "extract 6 2", + "980": { + "op": "!=", "defined_out": [ - "existing#0", - "length_uint16%0#0" + "tmp%5#0" ], "stack_out": [ - "existing#0", - "length_uint16%0#0" + "tmp%5#0" ] }, - "982": { - "op": "frame_dig -1", - "stack_out": [ - "existing#0", - "length_uint16%0#0", - "label#0 (copy)" - ] + "981": { + "op": "bz operator_only_bool_false@3", + "stack_out": [] }, "984": { - "op": "concat", + "op": "intc_0 // 1", "defined_out": [ - "encoded_value%0#0", - "existing#0" + "cond#0" ], "stack_out": [ - "existing#0", - "encoded_value%0#0" + "cond#0" ] }, "985": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "encoded_value%0#0", - "existing#0" + "block": "operator_only_bool_merge@4", + "stack_in": [ + "cond#0" ], - "stack_out": [ - "existing#0", - "encoded_value%0#0", - "1" - ] + "op": "bnz operator_only_after_if_else@7", + "defined_out": [], + "stack_out": [] }, - "986": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", + "988": { + "op": "bytec 7 // \"ERR:UNAUTH\"", + "defined_out": [ + "\"ERR:UNAUTH\"" + ], "stack_out": [ - "existing#0" + "\"ERR:UNAUTH\"" ] }, - "989": { - "op": "frame_dig -2", - "stack_out": [ - "existing#0", - "operator#0 (copy)" - ] + "990": { + "op": "log", + "stack_out": [] }, "991": { - "op": "box_del", + "op": "err" + }, + "992": { + "block": "operator_only_after_if_else@7", + "stack_in": [], + "retsub": true, + "op": "retsub" + }, + "993": { + "block": "operator_only_bool_false@3", + "stack_in": [], + "op": "intc_1 // 0", "defined_out": [ - "existing#0", - "{box_del}" + "cond#0" ], "stack_out": [ - "existing#0", - "{box_del}" + "cond#0" ] }, - "992": { - "op": "pop", + "994": { + "op": "b operator_only_bool_merge@4" + }, + "997": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "params": { + "operator#0": "bytes", + "label#0": "bytes" + }, + "block": "get_operator_label_index", + "stack_in": [], + "op": "proto 2 1" + }, + "1000": { + "op": "intc_1 // 0", "stack_out": [ - "existing#0" + "maybe_value%1#0" ] }, - "993": { - "op": "frame_dig -2", + "1001": { + "op": "bytec_1 // \"\"", "stack_out": [ - "existing#0", - "operator#0 (copy)" + "maybe_value%1#0", + "array_length%0#0" ] }, - "995": { - "op": "swap", + "1002": { + "op": "dup", "stack_out": [ - "operator#0 (copy)", - "existing#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0" ] }, - "996": { - "op": "box_put", - "stack_out": [] - }, - "997": { - "block": "add_operator_to_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", + "1003": { + "op": "frame_dig -2", "defined_out": [ - "label#0 (copy)" + "operator#0 (copy)" ], "stack_out": [ - "label#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "operator#0 (copy)" ] }, - "999": { - "op": "box_get", + "1005": { + "op": "box_len", "defined_out": [ - "label_descriptor#0", - "maybe_exists%3#0" + "maybe_exists%0#0", + "maybe_value%0#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_exists%3#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%0#0", + "maybe_exists%0#0" ] }, - "1000": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", + "1006": { + "op": "bury 1", "stack_out": [ - "label_descriptor#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%0#0" ] }, - "1001": { - "op": "dup", - "defined_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], + "1008": { + "op": "bnz get_operator_label_index_after_if_else@2", "stack_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0" ] }, - "1002": { - "op": "pushint 10 // 10", + "1011": { + "op": "intc 4 // 4294967296", "defined_out": [ - "10", - "label_descriptor#0", - "label_descriptor#0 (copy)" + "4294967296" ], "stack_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)", - "10" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "4294967296" ] }, - "1004": { - "op": "extract_uint64", - "defined_out": [ - "label_descriptor#0", - "tmp%9#0" - ], - "stack_out": [ - "label_descriptor#0", - "tmp%9#0" - ] + "1013": { + "op": "frame_bury 0" }, - "1005": { - "op": "intc_0 // 1", + "1015": { + "retsub": true, + "op": "retsub" + }, + "1016": { + "block": "get_operator_label_index_after_if_else@2", + "stack_in": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig -2", "defined_out": [ - "1", - "label_descriptor#0", - "tmp%9#0" + "operator#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "tmp%9#0", - "1" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "operator#0 (copy)" ] }, - "1006": { - "op": "+", + "1018": { + "op": "box_get", "defined_out": [ - "label_descriptor#0", - "to_encode%0#0" + "maybe_exists%1#0", + "maybe_value%1#0" ], "stack_out": [ - "label_descriptor#0", - "to_encode%0#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "1007": { - "op": "itob", - "defined_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" - ], + "1019": { + "op": "swap", "stack_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%1#0", + "maybe_value%1#0" ] }, - "1008": { - "op": "replace2 10", + "1020": { + "op": "dup", "stack_out": [ - "label_descriptor#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "maybe_value%1#0 (copy)" ] }, - "1010": { - "op": "frame_dig -1", + "1021": { + "op": "cover 2", "stack_out": [ - "label_descriptor#0", - "label#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0", + "maybe_value%1#0" ] }, - "1012": { - "op": "box_del", + "1023": { + "op": "frame_bury 0", "defined_out": [ - "label_descriptor#0", - "{box_del}" + "maybe_exists%1#0", + "maybe_value%1#0" ], "stack_out": [ - "label_descriptor#0", - "{box_del}" - ] - }, - "1013": { - "op": "pop", - "stack_out": [ - "label_descriptor#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "1014": { - "op": "frame_dig -1", + "1025": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", "stack_out": [ - "label_descriptor#0", - "label#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" ] }, - "1016": { - "op": "swap", + "1026": { + "op": "intc_1 // 0", "stack_out": [ - "label#0 (copy)", - "label_descriptor#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "0" ] }, - "1017": { - "op": "box_put", - "stack_out": [] - }, - "1018": { - "retsub": true, - "op": "retsub" - }, - "1019": { - "block": "add_operator_to_label_else_body@2", - "stack_in": [], - "op": "frame_dig -1", + "1027": { + "op": "extract_uint16", "defined_out": [ - "label#0 (copy)" + "array_length%0#0", + "maybe_value%1#0" ], "stack_out": [ - "label#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_length%0#0" ] }, - "1021": { - "op": "len", + "1028": { + "op": "frame_bury 1", "defined_out": [ - "length%1#0" + "array_length%0#0", + "maybe_value%1#0" ], "stack_out": [ - "length%1#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0" ] }, - "1022": { - "op": "itob", + "1030": { + "op": "intc_1 // 0", "defined_out": [ - "as_bytes%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%1#0" ], "stack_out": [ - "as_bytes%1#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0" ] }, - "1023": { - "op": "extract 6 2", + "1031": { + "op": "frame_bury 2", "defined_out": [ - "length_uint16%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%1#0" ], "stack_out": [ - "length_uint16%1#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0" ] }, - "1026": { - "op": "frame_dig -1", + "1033": { + "block": "get_operator_label_index_for_header@3", + "stack_in": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 2", + "defined_out": [ + "idx#0" + ], "stack_out": [ - "length_uint16%1#0", - "label#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0" ] }, - "1028": { - "op": "concat", + "1035": { + "op": "frame_dig 1", "defined_out": [ - "encoded_value%1#0" + "array_length%0#0", + "idx#0" ], "stack_out": [ - "encoded_value%1#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0", + "array_length%0#0" ] }, - "1029": { - "op": "bytec 9 // 0x0002", + "1037": { + "op": "<", "defined_out": [ - "0x0002", - "encoded_value%1#0" + "array_length%0#0", + "continue_looping%0#0", + "idx#0" ], "stack_out": [ - "encoded_value%1#0", - "0x0002" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "continue_looping%0#0" ] }, - "1031": { - "op": "swap", + "1038": { + "op": "bz get_operator_label_index_after_for@8", "stack_out": [ - "0x0002", - "encoded_value%1#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0" ] }, - "1032": { - "op": "concat", + "1041": { + "op": "frame_dig 0", "defined_out": [ - "result%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%1#0" ], "stack_out": [ - "result%1#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" ] }, - "1033": { - "op": "bytec 10 // 0x0001", + "1043": { + "op": "extract 2 0", "defined_out": [ - "0x0001", - "result%1#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" ], "stack_out": [ - "result%1#0", - "0x0001" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0" ] }, - "1035": { - "op": "swap", + "1046": { + "op": "frame_dig 2", "stack_out": [ - "0x0001", - "result%1#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0" ] }, - "1036": { - "op": "concat", + "1048": { + "op": "intc_2 // 2", "defined_out": [ - "array_data%0#0" + "2", + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" ], "stack_out": [ - "array_data%0#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0", + "2" ] }, - "1037": { - "op": "frame_dig -2", + "1049": { + "op": "*", "defined_out": [ - "array_data%0#0", - "operator#0 (copy)" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#0" ], "stack_out": [ - "array_data%0#0", - "operator#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0" ] }, - "1039": { - "op": "box_del", + "1050": { + "op": "dig 1", "defined_out": [ - "array_data%0#0", - "{box_del}" + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#0" ], "stack_out": [ - "array_data%0#0", - "{box_del}" - ] - }, - "1040": { - "op": "pop", - "stack_out": [ - "array_data%0#0" - ] - }, - "1041": { - "op": "frame_dig -2", - "stack_out": [ - "array_data%0#0", - "operator#0 (copy)" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" ] }, - "1043": { + "1052": { "op": "swap", "stack_out": [ - "operator#0 (copy)", - "array_data%0#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" ] }, - "1044": { - "op": "box_put", - "stack_out": [] - }, - "1045": { - "op": "b add_operator_to_label_after_if_else@3" - }, - "1048": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", - "params": { - "operator#0": "bytes", - "label#0": "bytes" - }, - "block": "remove_operator_from_label", - "stack_in": [], - "op": "proto 2 0" - }, - "1051": { - "op": "intc_1 // 0", + "1053": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "maybe_value%1#0" + ], "stack_out": [ - "label_descriptor#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" ] }, - "1052": { - "op": "dupn 4", + "1054": { + "op": "dup2", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", + "maybe_value%1#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" ] }, - "1054": { - "op": "bytec_2 // \"\"", + "1055": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_length%0#0", + "item_offset%0#0", + "maybe_value%1#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0" + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" ] }, - "1055": { - "op": "dupn 2", + "1056": { + "op": "intc_2 // 2", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0" + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" ] }, "1057": { - "op": "frame_dig -1", + "op": "+", "defined_out": [ - "label#0 (copy)" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "maybe_value%1#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0", - "label#0 (copy)" + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" ] }, - "1059": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", - "op": "callsub admin_or_operator_only", + "1058": { + "op": "extract3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "stored_label#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0" + "stored_label#0" ] }, - "1062": { - "op": "frame_dig -1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "1059": { + "op": "extract 2 0", + "defined_out": [ "array_length%0#0", "idx#0", - "label_idx#0", - "label#0 (copy)" - ] - }, - "1064": { - "op": "box_len", - "defined_out": [ - "cond#0", - "maybe_value%0#0" + "maybe_value%1#0", + "tmp%2#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0", - "maybe_value%0#0", - "cond#0" + "tmp%2#0" ] }, - "1065": { - "op": "bury 1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "1062": { + "op": "frame_dig -1", + "defined_out": [ "array_length%0#0", "idx#0", - "label_idx#0", - "cond#0" - ] - }, - "1067": { - "op": "bnz remove_operator_from_label_after_if_else@28", + "label#0 (copy)", + "maybe_value%1#0", + "tmp%2#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0" + "tmp%2#0", + "label#0 (copy)" ] }, - "1070": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "1064": { + "op": "==", "defined_out": [ - "\"ERR:NOEXIST\"" + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "tmp%3#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0", - "\"ERR:NOEXIST\"" + "tmp%3#0" ] }, - "1071": { - "op": "log", + "1065": { + "op": "bz get_operator_label_index_after_if_else@6", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1068": { + "op": "frame_dig 2", + "stack_out": [ + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0" + "idx#0" ] }, + "1070": { + "op": "frame_bury 0" + }, "1072": { - "op": "err" + "retsub": true, + "op": "retsub" }, "1073": { - "block": "remove_operator_from_label_after_if_else@28", + "block": "get_operator_label_index_after_if_else@6", "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", - "idx#0", - "label_idx#0" + "idx#0" ], - "op": "frame_dig -2", + "op": "frame_dig 2", "defined_out": [ - "operator#0 (copy)" + "idx#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0", - "operator#0 (copy)" + "idx#0" ] }, "1075": { - "op": "box_len", + "op": "intc_0 // 1", "defined_out": [ - "cond#0", - "maybe_value%1#0" + "1", + "idx#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "maybe_value%1#0", - "cond#0" - ] - }, - "1076": { - "op": "bury 1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "cond#0" + "idx#0", + "1" ] }, - "1078": { - "op": "bnz remove_operator_from_label_after_if_else@32", + "1076": { + "op": "+", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0" + "idx#0" ] }, - "1081": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "1077": { + "op": "frame_bury 2", "defined_out": [ - "\"ERR:NOEXIST\"" + "idx#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1082": { - "op": "log", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", - "idx#0", - "label_idx#0" + "idx#0" ] }, - "1083": { - "op": "err" + "1079": { + "op": "b get_operator_label_index_for_header@3" }, - "1084": { - "block": "remove_operator_from_label_after_if_else@32", + "1082": { + "block": "get_operator_label_index_after_for@8", "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", - "idx#0", - "label_idx#0" + "idx#0" ], - "op": "frame_dig -2", + "op": "intc_3 // 4294967295", "defined_out": [ - "operator#0 (copy)" + "4294967295" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", + "maybe_value%1#0", "array_length%0#0", "idx#0", - "label_idx#0", - "operator#0 (copy)" + "4294967295" ] }, + "1083": { + "op": "frame_bury 0" + }, + "1085": { + "retsub": true, + "op": "retsub" + }, "1086": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", + "params": { + "operator#0": "bytes", + "label#0": "bytes" + }, + "block": "add_operator_to_label", + "stack_in": [], + "op": "proto 2 0" + }, + "1089": { "op": "frame_dig -1", "defined_out": [ - "label#0 (copy)", - "operator#0 (copy)" + "label#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)", "label#0 (copy)" ] }, - "1088": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", - "defined_out": [ - "label_idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0" - ] - }, "1091": { - "op": "dup", + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", + "op": "callsub admin_or_operator_only", + "stack_out": [] + }, + "1094": { + "op": "frame_dig -1", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0", - "label_idx#0" + "label#0 (copy)" ] }, - "1092": { - "op": "frame_bury 7", + "1096": { + "op": "box_len", "defined_out": [ - "label_idx#0" + "cond#0", + "maybe_value%0#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0" + "maybe_value%0#0", + "cond#0" ] }, - "1094": { - "op": "intc_3 // 4294967295", + "1097": { + "op": "bury 1", + "stack_out": [ + "cond#0" + ] + }, + "1099": { + "op": "bnz add_operator_to_label_after_if_else@10", + "stack_out": [] + }, + "1102": { + "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ - "4294967295", - "label_idx#0" + "\"ERR:NOEXIST\"" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0", - "4294967295" + "\"ERR:NOEXIST\"" ] }, - "1095": { - "op": "!=", + "1103": { + "op": "log", + "stack_out": [] + }, + "1104": { + "op": "err" + }, + "1105": { + "block": "add_operator_to_label_after_if_else@10", + "stack_in": [], + "op": "frame_dig -2", "defined_out": [ - "label_idx#0", - "tmp%2#0" + "operator#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%2#0" + "operator#0 (copy)" ] }, - "1096": { - "op": "bz remove_operator_from_label_bool_false@3", + "1107": { + "op": "box_len", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "1099": { - "op": "frame_dig 7", + "1108": { + "op": "bury 1", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0" + "maybe_exists%1#0" ] }, - "1101": { - "op": "intc 4 // 4294967296", - "defined_out": [ - "4294967296", - "label_idx#0" - ], + "1110": { + "op": "bz add_operator_to_label_else_body@2", + "stack_out": [] + }, + "1113": { + "op": "frame_dig -2", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0", - "4294967296" + "operator#0 (copy)" ] }, - "1103": { - "op": "!=", + "1115": { + "op": "frame_dig -1", "defined_out": [ - "label_idx#0", - "tmp%3#0" + "label#0 (copy)", + "operator#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%3#0" + "operator#0 (copy)", + "label#0 (copy)" ] }, - "1104": { - "op": "bz remove_operator_from_label_bool_false@3", + "1117": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "op": "callsub get_operator_label_index", + "defined_out": [ + "tmp%2#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" + "tmp%2#0" ] }, - "1107": { - "op": "intc_0 // 1", + "1120": { + "op": "intc_3 // 4294967295", "defined_out": [ - "cond#0", - "label_idx#0" + "4294967295", + "tmp%2#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" + "tmp%2#0", + "4294967295" ] }, - "1108": { - "block": "remove_operator_from_label_bool_merge@4", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", + "1121": { + "op": "==", + "defined_out": [ "cond#0" ], - "op": "bnz remove_operator_from_label_after_if_else@24", - "defined_out": [], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" + "cond#0" ] }, - "1111": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "1122": { + "op": "bnz add_operator_to_label_after_if_else@6", + "stack_out": [] + }, + "1125": { + "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ - "\"ERR:NOEXIST\"" + "\"ERR:EXISTS\"" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "\"ERR:NOEXIST\"" + "\"ERR:EXISTS\"" ] }, - "1112": { + "1127": { "op": "log", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] + "stack_out": [] }, - "1113": { + "1128": { "op": "err" }, - "1114": { - "block": "remove_operator_from_label_after_if_else@24", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig -1", + "1129": { + "block": "add_operator_to_label_after_if_else@6", + "stack_in": [], + "op": "frame_dig -2", "defined_out": [ - "label#0 (copy)" + "operator#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label#0 (copy)" + "operator#0 (copy)" ] }, - "1116": { + "1131": { "op": "box_get", "defined_out": [ - "label_descriptor#0", + "existing#0", "maybe_exists%2#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", + "existing#0", "maybe_exists%2#0" ] }, - "1117": { - "op": "swap", + "1132": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_exists%2#0", - "label_descriptor#0" + "existing#0" ] }, - "1118": { - "op": "dup", + "1133": { + "op": "frame_dig -1", + "defined_out": [ + "existing#0", + "label#0 (copy)" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_exists%2#0", - "label_descriptor#0", - "label_descriptor#0 (copy)" + "existing#0", + "label#0 (copy)" ] }, - "1119": { - "op": "cover 2", + "1135": { + "op": "len", + "defined_out": [ + "existing#0", + "length%0#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "maybe_exists%2#0", - "label_descriptor#0" + "existing#0", + "length%0#0" ] }, - "1121": { - "op": "frame_bury 0", + "1136": { + "op": "itob", "defined_out": [ - "label_descriptor#0", - "maybe_exists%2#0" + "as_bytes%0#0", + "existing#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "maybe_exists%2#0" + "existing#0", + "as_bytes%0#0" ] }, - "1123": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", + "1137": { + "op": "extract 6 2", + "defined_out": [ + "existing#0", + "length_uint16%0#0" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0" + "existing#0", + "length_uint16%0#0" ] }, - "1124": { - "error": "Index access is out of bounds", - "op": "extract 10 8 // on error: Index access is out of bounds", - "defined_out": [ - "label_descriptor#0", - "reinterpret_biguint%0#0" - ], + "1140": { + "op": "frame_dig -1", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%0#0" + "existing#0", + "length_uint16%0#0", + "label#0 (copy)" ] }, - "1127": { - "op": "pushbytes 0x0000000000000001", + "1142": { + "op": "concat", "defined_out": [ - "0x0000000000000001", - "label_descriptor#0", - "reinterpret_biguint%0#0" + "encoded_value%0#0", + "existing#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%0#0", - "0x0000000000000001" + "existing#0", + "encoded_value%0#0" ] }, - "1137": { - "op": "b>", + "1143": { + "op": "intc_0 // 1", "defined_out": [ - "label_descriptor#0", - "tmp%5#0" + "1", + "encoded_value%0#0", + "existing#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%5#0" + "existing#0", + "encoded_value%0#0", + "1" ] }, - "1138": { - "op": "bnz remove_operator_from_label_bool_true@6", + "1144": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" + "existing#0" ] }, - "1141": { - "op": "frame_dig 0", + "1147": { + "op": "frame_dig -2", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0" + "existing#0", + "operator#0 (copy)" ] }, - "1143": { - "error": "Index access is out of bounds", - "op": "extract 2 8 // on error: Index access is out of bounds", + "1149": { + "op": "box_del", "defined_out": [ - "label_descriptor#0", - "reinterpret_biguint%2#0" + "existing#0", + "{box_del}" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%2#0" + "existing#0", + "{box_del}" ] }, - "1146": { - "op": "bytec 7 // 0x0000000000000000", - "defined_out": [ - "0x0000000000000000", - "label_descriptor#0", - "reinterpret_biguint%2#0" - ], + "1150": { + "op": "pop", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%2#0", - "0x0000000000000000" + "existing#0" ] }, - "1148": { - "op": "b==", - "defined_out": [ - "label_descriptor#0", - "tmp%6#0" - ], + "1151": { + "op": "frame_dig -2", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%6#0" + "existing#0", + "operator#0 (copy)" ] }, - "1149": { - "op": "bz remove_operator_from_label_bool_false@7", + "1153": { + "op": "swap", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" + "operator#0 (copy)", + "existing#0" ] }, - "1152": { - "block": "remove_operator_from_label_bool_true@6", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "intc_0 // 1", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ] + "1154": { + "op": "box_put", + "stack_out": [] }, - "1153": { - "block": "remove_operator_from_label_bool_merge@8", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" + "1155": { + "block": "add_operator_to_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" ], - "op": "bnz remove_operator_from_label_after_if_else@20", - "defined_out": [], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" + "label#0 (copy)" ] }, - "1156": { - "op": "bytec 8 // \"ERR:NOEMPTY\"", + "1157": { + "op": "box_get", "defined_out": [ - "\"ERR:NOEMPTY\"" + "label_descriptor#0", + "maybe_exists%3#0" ], "stack_out": [ "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "\"ERR:NOEMPTY\"" + "maybe_exists%3#0" ] }, "1158": { - "op": "log", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1159": { - "op": "err" - }, - "1160": { - "block": "remove_operator_from_label_after_if_else@20", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "label_descriptor#0" - ], + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0" ] }, - "1162": { + "1159": { "op": "dup", "defined_out": [ "label_descriptor#0", "label_descriptor#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0", "label_descriptor#0 (copy)" ] }, - "1163": { + "1160": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -5921,266 +5943,305 @@ "label_descriptor#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0", "label_descriptor#0 (copy)", "10" ] }, - "1165": { + "1162": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", - "tmp%8#0" + "tmp%9#0" ], "stack_out": [ "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "tmp%8#0" + "tmp%9#0" ] }, - "1166": { + "1163": { "op": "intc_0 // 1", "defined_out": [ "1", "label_descriptor#0", - "tmp%8#0" + "tmp%9#0" ], "stack_out": [ "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "tmp%8#0", + "tmp%9#0", "1" ] }, - "1167": { - "op": "-", + "1164": { + "op": "+", "defined_out": [ "label_descriptor#0", "to_encode%0#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0", "to_encode%0#0" ] }, - "1168": { + "1165": { "op": "itob", "defined_out": [ "label_descriptor#0", "val_as_bytes%0#0" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0", "val_as_bytes%0#0" ] }, - "1169": { + "1166": { "op": "replace2 10", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0" ] }, - "1171": { + "1168": { "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)", - "label_descriptor#0" - ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0", "label#0 (copy)" ] }, - "1173": { + "1170": { "op": "box_del", "defined_out": [ "label_descriptor#0", "{box_del}" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0", "{box_del}" ] }, - "1174": { + "1171": { "op": "pop", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0" ] }, - "1175": { + "1172": { "op": "frame_dig -1", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label_descriptor#0", "label#0 (copy)" ] }, - "1177": { + "1174": { "op": "swap", "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", "label#0 (copy)", "label_descriptor#0" ] }, - "1178": { + "1175": { "op": "box_put", + "stack_out": [] + }, + "1176": { + "retsub": true, + "op": "retsub" + }, + "1177": { + "block": "add_operator_to_label_else_body@2", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" + ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" + "label#0 (copy)" ] }, "1179": { + "op": "len", + "defined_out": [ + "length%1#0" + ], + "stack_out": [ + "length%1#0" + ] + }, + "1180": { + "op": "itob", + "defined_out": [ + "as_bytes%1#0" + ], + "stack_out": [ + "as_bytes%1#0" + ] + }, + "1181": { + "op": "extract 6 2", + "defined_out": [ + "length_uint16%1#0" + ], + "stack_out": [ + "length_uint16%1#0" + ] + }, + "1184": { + "op": "frame_dig -1", + "stack_out": [ + "length_uint16%1#0", + "label#0 (copy)" + ] + }, + "1186": { + "op": "concat", + "defined_out": [ + "encoded_value%1#0" + ], + "stack_out": [ + "encoded_value%1#0" + ] + }, + "1187": { + "op": "bytec 6 // 0x0002", + "defined_out": [ + "0x0002", + "encoded_value%1#0" + ], + "stack_out": [ + "encoded_value%1#0", + "0x0002" + ] + }, + "1189": { + "op": "swap", + "stack_out": [ + "0x0002", + "encoded_value%1#0" + ] + }, + "1190": { + "op": "concat", + "defined_out": [ + "result%1#0" + ], + "stack_out": [ + "result%1#0" + ] + }, + "1191": { + "op": "bytec 11 // 0x0001", + "defined_out": [ + "0x0001", + "result%1#0" + ], + "stack_out": [ + "result%1#0", + "0x0001" + ] + }, + "1193": { + "op": "swap", + "stack_out": [ + "0x0001", + "result%1#0" + ] + }, + "1194": { + "op": "concat", + "defined_out": [ + "array_data%0#0" + ], + "stack_out": [ + "array_data%0#0" + ] + }, + "1195": { "op": "frame_dig -2", "defined_out": [ - "label_descriptor#0", + "array_data%0#0", "operator#0 (copy)" ], "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", + "array_data%0#0", "operator#0 (copy)" ] }, - "1181": { - "op": "box_get", + "1197": { + "op": "box_del", "defined_out": [ - "label_descriptor#0", - "maybe_exists%3#0", - "maybe_value%3#0" + "array_data%0#0", + "{box_del}" ], + "stack_out": [ + "array_data%0#0", + "{box_del}" + ] + }, + "1198": { + "op": "pop", + "stack_out": [ + "array_data%0#0" + ] + }, + "1199": { + "op": "frame_dig -2", + "stack_out": [ + "array_data%0#0", + "operator#0 (copy)" + ] + }, + "1201": { + "op": "swap", + "stack_out": [ + "operator#0 (copy)", + "array_data%0#0" + ] + }, + "1202": { + "op": "box_put", + "stack_out": [] + }, + "1203": { + "op": "b add_operator_to_label_after_if_else@3" + }, + "1206": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", + "params": { + "operator#0": "bytes", + "label#0": "bytes" + }, + "block": "remove_operator_from_label", + "stack_in": [], + "op": "proto 2 0" + }, + "1209": { + "op": "intc_1 // 0", + "stack_out": [ + "label_descriptor#0" + ] + }, + "1210": { + "op": "dupn 4", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%3#0", - "maybe_exists%3#0" + "stored_label#0" ] }, - "1182": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", + "1212": { + "op": "bytec_1 // \"\"", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", "next_list#9", "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%3#0" + "array_length%0#0" ] }, - "1183": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "label_descriptor#0", - "maybe_value%3#0" - ], + "1213": { + "op": "dupn 2", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6189,16 +6250,13 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "maybe_value%3#0", - "0" + "label_idx#0" ] }, - "1184": { - "op": "extract_uint16", + "1215": { + "op": "frame_dig -1", "defined_out": [ - "label_descriptor#0", - "tmp%11#0" + "label#0 (copy)" ], "stack_out": [ "label_descriptor#0", @@ -6209,11 +6267,12 @@ "array_length%0#0", "idx#0", "label_idx#0", - "tmp%11#0" + "label#0 (copy)" ] }, - "1185": { - "op": "intc_0 // 1", + "1217": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", + "op": "callsub admin_or_operator_only", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6222,17 +6281,11 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "tmp%11#0", - "1" + "label_idx#0" ] }, - "1186": { - "op": "==", - "defined_out": [ - "label_descriptor#0", - "tmp%12#0" - ], + "1220": { + "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6242,11 +6295,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "tmp%12#0" + "label#0 (copy)" ] }, - "1187": { - "op": "bz remove_operator_from_label_else_body@10", + "1222": { + "op": "box_len", + "defined_out": [ + "cond#0", + "maybe_value%0#0" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6255,11 +6312,13 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" + "label_idx#0", + "maybe_value%0#0", + "cond#0" ] }, - "1190": { - "op": "frame_dig -2", + "1223": { + "op": "bury 1", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6269,11 +6328,27 @@ "array_length%0#0", "idx#0", "label_idx#0", - "operator#0 (copy)" + "cond#0" ] }, - "1192": { - "op": "box_del", + "1225": { + "op": "bnz remove_operator_from_label_after_if_else@28", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1228": { + "op": "bytec_0 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6283,11 +6358,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "{box_del}" + "\"ERR:NOEXIST\"" ] }, - "1193": { - "op": "pop", + "1229": { + "op": "log", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6299,12 +6374,11 @@ "label_idx#0" ] }, - "1194": { - "retsub": true, - "op": "retsub" + "1230": { + "op": "err" }, - "1195": { - "block": "remove_operator_from_label_else_body@10", + "1231": { + "block": "remove_operator_from_label_after_if_else@28", "stack_in": [ "label_descriptor#0", "maybe_value%4#0", @@ -6315,9 +6389,9 @@ "idx#0", "label_idx#0" ], - "op": "bytec 11 // 0x0000", + "op": "frame_dig -2", "defined_out": [ - "next_list#0" + "operator#0 (copy)" ], "stack_out": [ "label_descriptor#0", @@ -6328,13 +6402,14 @@ "array_length%0#0", "idx#0", "label_idx#0", - "next_list#0" + "operator#0 (copy)" ] }, - "1197": { - "op": "frame_bury 2", + "1233": { + "op": "box_len", "defined_out": [ - "next_list#0" + "cond#0", + "maybe_value%1#0" ], "stack_out": [ "label_descriptor#0", @@ -6344,15 +6419,13 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" + "label_idx#0", + "maybe_value%1#0", + "cond#0" ] }, - "1199": { - "op": "frame_dig -2", - "defined_out": [ - "next_list#0", - "operator#0 (copy)" - ], + "1234": { + "op": "bury 1", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6362,16 +6435,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "operator#0 (copy)" + "cond#0" ] }, - "1201": { - "op": "box_get", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "next_list#0" - ], + "1236": { + "op": "bnz remove_operator_from_label_after_if_else@32", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6380,13 +6448,14 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "maybe_value%4#0", - "maybe_exists%4#0" + "label_idx#0" ] }, - "1202": { - "op": "swap", + "1239": { + "op": "bytec_0 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6396,12 +6465,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "maybe_exists%4#0", - "maybe_value%4#0" + "\"ERR:NOEXIST\"" ] }, - "1203": { - "op": "dup", + "1240": { + "op": "log", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6410,15 +6478,15 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "maybe_value%4#0 (copy)" + "label_idx#0" ] }, - "1204": { - "op": "cover 2", - "stack_out": [ + "1241": { + "op": "err" + }, + "1242": { + "block": "remove_operator_from_label_after_if_else@32", + "stack_in": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", @@ -6426,18 +6494,11 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "maybe_value%4#0", - "maybe_exists%4#0", - "maybe_value%4#0" - ] - }, - "1206": { - "op": "frame_bury 1", + "label_idx#0" + ], + "op": "frame_dig -2", "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "next_list#0" + "operator#0 (copy)" ], "stack_out": [ "label_descriptor#0", @@ -6448,13 +6509,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "maybe_value%4#0", - "maybe_exists%4#0" + "operator#0 (copy)" ] }, - "1208": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", + "1244": { + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)", + "operator#0 (copy)" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6464,11 +6527,16 @@ "array_length%0#0", "idx#0", "label_idx#0", - "maybe_value%4#0" + "operator#0 (copy)", + "label#0 (copy)" ] }, - "1209": { - "op": "intc_1 // 0", + "1246": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "op": "callsub get_operator_label_index", + "defined_out": [ + "label_idx#0" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6478,17 +6546,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "maybe_value%4#0", - "0" + "label_idx#0" ] }, - "1210": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0", - "maybe_value%4#0", - "next_list#0" - ], + "1249": { + "op": "dup", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6498,15 +6560,14 @@ "array_length%0#0", "idx#0", "label_idx#0", - "array_length%0#0" + "label_idx#0", + "label_idx#0" ] }, - "1211": { - "op": "frame_bury 5", + "1250": { + "op": "frame_bury 7", "defined_out": [ - "array_length%0#0", - "maybe_value%4#0", - "next_list#0" + "label_idx#0" ], "stack_out": [ "label_descriptor#0", @@ -6516,16 +6577,15 @@ "stored_label#0", "array_length%0#0", "idx#0", + "label_idx#0", "label_idx#0" ] }, - "1213": { - "op": "intc_1 // 0", + "1252": { + "op": "intc_3 // 4294967295", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "next_list#0" + "4294967295", + "label_idx#0" ], "stack_out": [ "label_descriptor#0", @@ -6536,16 +6596,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0" + "label_idx#0", + "4294967295" ] }, - "1214": { - "op": "frame_bury 6", + "1253": { + "op": "!=", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "next_list#0" + "label_idx#0", + "tmp%2#0" ], "stack_out": [ "label_descriptor#0", @@ -6555,12 +6614,13 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" + "label_idx#0", + "tmp%2#0" ] }, - "1216": { - "block": "remove_operator_from_label_for_header@11", - "stack_in": [ + "1254": { + "op": "bz remove_operator_from_label_bool_false@3", + "stack_out": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", @@ -6569,11 +6629,10 @@ "array_length%0#0", "idx#0", "label_idx#0" - ], - "op": "frame_dig 6", - "defined_out": [ - "idx#0" - ], + ] + }, + "1257": { + "op": "frame_dig 7", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6583,14 +6642,14 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0" + "label_idx#0" ] }, - "1218": { - "op": "frame_dig 5", + "1259": { + "op": "intc 4 // 4294967296", "defined_out": [ - "array_length%0#0", - "idx#0" + "4294967296", + "label_idx#0" ], "stack_out": [ "label_descriptor#0", @@ -6601,16 +6660,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_length%0#0" + "label_idx#0", + "4294967296" ] }, - "1220": { - "op": "<", + "1261": { + "op": "!=", "defined_out": [ - "array_length%0#0", - "continue_looping%0#0", - "idx#0" + "label_idx#0", + "tmp%3#0" ], "stack_out": [ "label_descriptor#0", @@ -6621,11 +6679,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "continue_looping%0#0" + "tmp%3#0" ] }, - "1221": { - "op": "bz remove_operator_from_label_after_for@16", + "1262": { + "op": "bz remove_operator_from_label_bool_false@3", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6637,12 +6695,11 @@ "label_idx#0" ] }, - "1224": { - "op": "frame_dig 1", + "1265": { + "op": "intc_0 // 1", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0" + "cond#0", + "label_idx#0" ], "stack_out": [ "label_descriptor#0", @@ -6653,17 +6710,24 @@ "array_length%0#0", "idx#0", "label_idx#0", - "maybe_value%4#0" + "cond#0" ] }, - "1226": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0", + "1266": { + "block": "remove_operator_from_label_bool_merge@4", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "maybe_value%4#0" + "label_idx#0", + "cond#0" ], + "op": "bnz remove_operator_from_label_after_if_else@24", + "defined_out": [], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6672,12 +6736,14 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "array_head_and_tail%0#0" + "label_idx#0" ] }, - "1229": { - "op": "frame_dig 6", + "1269": { + "op": "bytec_0 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6687,19 +6753,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "array_head_and_tail%0#0", - "idx#0" + "\"ERR:NOEXIST\"" ] }, - "1231": { - "op": "dup", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "idx#0 (copy)", - "maybe_value%4#0" - ], + "1270": { + "op": "log", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6708,15 +6766,15 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "array_head_and_tail%0#0", - "idx#0 (copy)", - "idx#0 (copy)" + "label_idx#0" ] }, - "1232": { - "op": "cover 2", - "stack_out": [ + "1271": { + "op": "err" + }, + "1272": { + "block": "remove_operator_from_label_after_if_else@24", + "stack_in": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", @@ -6724,21 +6782,11 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0 (copy)" - ] - }, - "1234": { - "op": "intc_2 // 2", + "label_idx#0" + ], + "op": "frame_dig -1", "defined_out": [ - "2", - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "idx#0 (copy)", - "maybe_value%4#0" + "label#0 (copy)" ], "stack_out": [ "label_descriptor#0", @@ -6749,20 +6797,14 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0 (copy)", - "2" + "label#0 (copy)" ] }, - "1235": { - "op": "*", + "1274": { + "op": "box_get", "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%4#0" + "label_descriptor#0", + "maybe_exists%2#0" ], "stack_out": [ "label_descriptor#0", @@ -6773,21 +6815,12 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0" + "label_descriptor#0", + "maybe_exists%2#0" ] }, - "1236": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%4#0" - ], + "1275": { + "op": "swap", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6797,14 +6830,12 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0", - "array_head_and_tail%0#0 (copy)" + "maybe_exists%2#0", + "label_descriptor#0" ] }, - "1238": { - "op": "swap", + "1276": { + "op": "dup", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6814,21 +6845,13 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset_offset%0#0" + "maybe_exists%2#0", + "label_descriptor#0", + "label_descriptor#0 (copy)" ] }, - "1239": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "maybe_value%4#0" - ], + "1277": { + "op": "cover 2", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6838,21 +6861,16 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" + "label_descriptor#0", + "maybe_exists%2#0", + "label_descriptor#0" ] }, - "1240": { - "op": "dup2", + "1279": { + "op": "frame_bury 0", "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "item_offset%0#0 (copy)", - "maybe_value%4#0" + "label_descriptor#0", + "maybe_exists%2#0" ], "stack_out": [ "label_descriptor#0", @@ -6863,23 +6881,13 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" + "label_descriptor#0", + "maybe_exists%2#0" ] }, - "1241": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_length%0#0", - "item_offset%0#0", - "maybe_value%4#0" - ], + "1281": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6889,14 +6897,16 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" + "label_descriptor#0" ] }, - "1242": { - "op": "intc_2 // 2", + "1282": { + "error": "Index access is out of bounds", + "op": "extract 10 8 // on error: Index access is out of bounds", + "defined_out": [ + "label_descriptor#0", + "reinterpret_biguint%0#0" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6906,22 +6916,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" + "reinterpret_biguint%0#0" ] }, - "1243": { - "op": "+", + "1285": { + "op": "pushbytes 0x0000000000000001", "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_head_tail_length%0#0", - "item_offset%0#0", - "maybe_value%4#0" + "0x0000000000000001", + "label_descriptor#0", + "reinterpret_biguint%0#0" ], "stack_out": [ "label_descriptor#0", @@ -6932,19 +6935,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" + "reinterpret_biguint%0#0", + "0x0000000000000001" ] }, - "1244": { - "op": "extract3", + "1295": { + "op": "b>", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "stored_label#0" + "label_descriptor#0", + "tmp%5#0" ], "stack_out": [ "label_descriptor#0", @@ -6955,18 +6954,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "stored_label#0" + "tmp%5#0" ] }, - "1245": { - "op": "frame_bury 4", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "stored_label#0" - ], + "1296": { + "op": "bnz remove_operator_from_label_bool_true@6", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6975,19 +6967,11 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "idx#0" + "label_idx#0" ] }, - "1247": { - "op": "frame_dig 7", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "stored_label#0" - ], + "1299": { + "op": "frame_dig 0", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6997,19 +6981,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", - "label_idx#0" + "label_descriptor#0" ] }, - "1249": { - "op": "!=", + "1301": { + "error": "Index access is out of bounds", + "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "stored_label#0", - "tmp%15#0" + "label_descriptor#0", + "reinterpret_biguint%2#0" ], "stack_out": [ "label_descriptor#0", @@ -7020,19 +7000,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "tmp%15#0" + "reinterpret_biguint%2#0" ] }, - "1250": { - "op": "frame_dig 2", + "1304": { + "op": "bytec 9 // 0x0000000000000000", "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "next_list#9", - "stored_label#0", - "tmp%15#0" + "0x0000000000000000", + "label_descriptor#0", + "reinterpret_biguint%2#0" ], "stack_out": [ "label_descriptor#0", @@ -7043,20 +7019,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "tmp%15#0", - "next_list#9" + "reinterpret_biguint%2#0", + "0x0000000000000000" ] }, - "1252": { - "op": "frame_bury 3", + "1306": { + "op": "b==", "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "next_list#9", - "stored_label#0", - "tmp%15#0" + "label_descriptor#0", + "tmp%6#0" ], "stack_out": [ "label_descriptor#0", @@ -7067,11 +7038,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "tmp%15#0" + "tmp%6#0" ] }, - "1254": { - "op": "bz remove_operator_from_label_after_if_else@14", + "1307": { + "op": "bz remove_operator_from_label_bool_false@7", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -7083,16 +7054,21 @@ "label_idx#0" ] }, - "1257": { - "op": "frame_dig 2", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", + "1310": { + "block": "remove_operator_from_label_bool_true@6", + "stack_in": [ + "label_descriptor#0", "maybe_value%4#0", "next_list#0", "next_list#9", - "stored_label#0" + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "intc_0 // 1", + "defined_out": [ + "cond#0" ], "stack_out": [ "label_descriptor#0", @@ -7103,12 +7079,12 @@ "array_length%0#0", "idx#0", "label_idx#0", - "next_list#0" + "cond#0" ] }, - "1259": { - "op": "frame_dig 4", - "stack_out": [ + "1311": { + "block": "remove_operator_from_label_bool_merge@8", + "stack_in": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", @@ -7117,22 +7093,10 @@ "array_length%0#0", "idx#0", "label_idx#0", - "next_list#0", - "stored_label#0" - ] - }, - "1261": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0" + "cond#0" ], + "op": "bnz remove_operator_from_label_after_if_else@20", + "defined_out": [], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -7141,15 +7105,14 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0", - "next_list#0", - "stored_label#0", - "1" + "label_idx#0" ] }, - "1262": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", + "1314": { + "op": "bytec 10 // \"ERR:NOEMPTY\"", + "defined_out": [ + "\"ERR:NOEMPTY\"" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -7159,11 +7122,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "next_list#9" + "\"ERR:NOEMPTY\"" ] }, - "1265": { - "op": "frame_bury 3", + "1316": { + "op": "log", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -7175,8 +7138,11 @@ "label_idx#0" ] }, - "1267": { - "block": "remove_operator_from_label_after_if_else@14", + "1317": { + "op": "err" + }, + "1318": { + "block": "remove_operator_from_label_after_if_else@20", "stack_in": [ "label_descriptor#0", "maybe_value%4#0", @@ -7187,9 +7153,9 @@ "idx#0", "label_idx#0" ], - "op": "frame_dig 3", + "op": "frame_dig 0", "defined_out": [ - "next_list#0" + "label_descriptor#0" ], "stack_out": [ "label_descriptor#0", @@ -7200,13 +7166,14 @@ "array_length%0#0", "idx#0", "label_idx#0", - "next_list#0" + "label_descriptor#0" ] }, - "1269": { - "op": "frame_bury 2", + "1320": { + "op": "dup", "defined_out": [ - "next_list#0" + "label_descriptor#0", + "label_descriptor#0 (copy)" ], "stack_out": [ "label_descriptor#0", @@ -7216,14 +7183,37 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" + "label_idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)" ] }, - "1271": { - "op": "frame_dig 6", + "1321": { + "op": "pushint 10 // 10", "defined_out": [ + "10", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", "idx#0", - "next_list#0" + "label_idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)", + "10" + ] + }, + "1323": { + "op": "extract_uint64", + "defined_out": [ + "label_descriptor#0", + "tmp%8#0" ], "stack_out": [ "label_descriptor#0", @@ -7234,15 +7224,16 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0" + "label_descriptor#0", + "tmp%8#0" ] }, - "1273": { + "1324": { "op": "intc_0 // 1", "defined_out": [ "1", - "idx#0", - "next_list#0" + "label_descriptor#0", + "tmp%8#0" ], "stack_out": [ "label_descriptor#0", @@ -7253,12 +7244,17 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0", + "label_descriptor#0", + "tmp%8#0", "1" ] }, - "1274": { - "op": "+", + "1325": { + "op": "-", + "defined_out": [ + "label_descriptor#0", + "to_encode%0#0" + ], "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -7268,14 +7264,15 @@ "array_length%0#0", "idx#0", "label_idx#0", - "idx#0" + "label_descriptor#0", + "to_encode%0#0" ] }, - "1275": { - "op": "frame_bury 6", + "1326": { + "op": "itob", "defined_out": [ - "idx#0", - "next_list#0" + "label_descriptor#0", + "val_as_bytes%0#0" ], "stack_out": [ "label_descriptor#0", @@ -7285,15 +7282,14 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" + "label_idx#0", + "label_descriptor#0", + "val_as_bytes%0#0" ] }, - "1277": { - "op": "b remove_operator_from_label_for_header@11" - }, - "1280": { - "block": "remove_operator_from_label_after_for@16", - "stack_in": [ + "1327": { + "op": "replace2 10", + "stack_out": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", @@ -7301,11 +7297,15 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" - ], - "op": "frame_dig -2", + "label_idx#0", + "label_descriptor#0" + ] + }, + "1329": { + "op": "frame_dig -1", "defined_out": [ - "operator#0 (copy)" + "label#0 (copy)", + "label_descriptor#0" ], "stack_out": [ "label_descriptor#0", @@ -7316,12 +7316,14 @@ "array_length%0#0", "idx#0", "label_idx#0", - "operator#0 (copy)" + "label_descriptor#0", + "label#0 (copy)" ] }, - "1282": { + "1331": { "op": "box_del", "defined_out": [ + "label_descriptor#0", "{box_del}" ], "stack_out": [ @@ -7333,10 +7335,11 @@ "array_length%0#0", "idx#0", "label_idx#0", + "label_descriptor#0", "{box_del}" ] }, - "1283": { + "1332": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -7346,11 +7349,12 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" + "label_idx#0", + "label_descriptor#0" ] }, - "1284": { - "op": "frame_dig -2", + "1333": { + "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -7360,15 +7364,12 @@ "array_length%0#0", "idx#0", "label_idx#0", - "operator#0 (copy)" + "label_descriptor#0", + "label#0 (copy)" ] }, - "1286": { - "op": "frame_dig 2", - "defined_out": [ - "next_list#0", - "operator#0 (copy)" - ], + "1335": { + "op": "swap", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -7378,11 +7379,11 @@ "array_length%0#0", "idx#0", "label_idx#0", - "operator#0 (copy)", - "next_list#0" + "label#0 (copy)", + "label_descriptor#0" ] }, - "1288": { + "1336": { "op": "box_put", "stack_out": [ "label_descriptor#0", @@ -7395,13 +7396,13 @@ "label_idx#0" ] }, - "1289": { - "retsub": true, - "op": "retsub" - }, - "1290": { - "block": "remove_operator_from_label_bool_false@7", - "stack_in": [ + "1337": { + "op": "frame_dig -2", + "defined_out": [ + "label_descriptor#0", + "operator#0 (copy)" + ], + "stack_out": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", @@ -7409,11 +7410,16 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" - ], - "op": "intc_1 // 0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1339": { + "op": "box_get", "defined_out": [ - "cond#0" + "label_descriptor#0", + "maybe_exists%3#0", + "maybe_value%3#0" ], "stack_out": [ "label_descriptor#0", @@ -7424,15 +7430,14 @@ "array_length%0#0", "idx#0", "label_idx#0", - "cond#0" + "maybe_value%3#0", + "maybe_exists%3#0" ] }, - "1291": { - "op": "b remove_operator_from_label_bool_merge@8" - }, - "1294": { - "block": "remove_operator_from_label_bool_false@3", - "stack_in": [ + "1340": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", + "stack_out": [ "label_descriptor#0", "maybe_value%4#0", "next_list#0", @@ -7440,11 +7445,16 @@ "stored_label#0", "array_length%0#0", "idx#0", - "label_idx#0" - ], + "label_idx#0", + "maybe_value%3#0" + ] + }, + "1341": { "op": "intc_1 // 0", "defined_out": [ - "cond#0" + "0", + "label_descriptor#0", + "maybe_value%3#0" ], "stack_out": [ "label_descriptor#0", @@ -7455,1055 +7465,1439 @@ "array_length%0#0", "idx#0", "label_idx#0", - "cond#0" + "maybe_value%3#0", + "0" ] }, - "1295": { - "op": "b remove_operator_from_label_bool_merge@4" - }, - "1298": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", - "params": { - "operator#0": "bytes" - }, - "block": "get_operator_labels", - "stack_in": [], - "op": "proto 1 1" - }, - "1301": { - "op": "frame_dig -1", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "operator#0 (copy)" - ] - }, - "1303": { - "op": "box_len", + "1342": { + "op": "extract_uint16", "defined_out": [ - "cond#0", - "maybe_value%0#0" + "label_descriptor#0", + "tmp%11#0" ], "stack_out": [ - "maybe_value%0#0", - "cond#0" + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%11#0" ] }, - "1304": { - "op": "bury 1", + "1343": { + "op": "intc_0 // 1", "stack_out": [ - "cond#0" + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%11#0", + "1" ] }, - "1306": { - "op": "bnz get_operator_labels_after_if_else@3", - "stack_out": [] - }, - "1309": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "1344": { + "op": "==", "defined_out": [ - "\"ERR:NOEXIST\"" + "label_descriptor#0", + "tmp%12#0" ], "stack_out": [ - "\"ERR:NOEXIST\"" + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%12#0" ] }, - "1310": { - "op": "log", - "stack_out": [] - }, - "1311": { - "op": "err" + "1345": { + "op": "bz remove_operator_from_label_else_body@10", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] }, - "1312": { - "block": "get_operator_labels_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "operator#0 (copy)" - ], + "1348": { + "op": "frame_dig -2", "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", "operator#0 (copy)" ] }, - "1314": { - "op": "box_get", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], + "1350": { + "op": "box_del", "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "{box_del}" ] }, - "1315": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", + "1351": { + "op": "pop", "stack_out": [ - "maybe_value%1#0" + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" ] }, - "1316": { + "1352": { "retsub": true, "op": "retsub" }, - "1317": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", - "params": { - "label#0": "bytes", - "asset#0": "uint64" - }, - "block": "add_label_to_asset", - "stack_in": [], - "op": "proto 2 0" - }, - "1320": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%1#1" - ] - }, - "1321": { - "op": "dup", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0" - ] - }, - "1322": { - "op": "bytec_2 // \"\"", + "1353": { + "block": "remove_operator_from_label_else_body@10", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "next_list#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0" + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "next_list#0" ] }, - "1323": { - "op": "dup", + "1354": { + "op": "frame_bury 2", + "defined_out": [ + "next_list#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0" ] }, - "1324": { + "1356": { "op": "frame_dig -2", "defined_out": [ - "label#0 (copy)" + "next_list#0", + "operator#0 (copy)" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label#0 (copy)" + "label_idx#0", + "operator#0 (copy)" ] }, - "1326": { - "op": "box_len", + "1358": { + "op": "box_get", "defined_out": [ - "cond#0", - "maybe_value%0#0" + "maybe_exists%4#0", + "maybe_value%4#0", + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "maybe_value%0#0", - "cond#0" + "label_idx#0", + "maybe_value%4#0", + "maybe_exists%4#0" ] }, - "1327": { - "op": "bury 1", + "1359": { + "op": "swap", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "cond#0" + "label_idx#0", + "maybe_exists%4#0", + "maybe_value%4#0" ] }, - "1329": { - "op": "bnz add_label_to_asset_after_if_else@19", + "1360": { + "op": "dup", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0", + "maybe_exists%4#0", + "maybe_value%4#0", + "maybe_value%4#0 (copy)" ] }, - "1332": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], + "1361": { + "op": "cover 2", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "\"ERR:NOEXIST\"" + "label_idx#0", + "maybe_value%4#0", + "maybe_exists%4#0", + "maybe_value%4#0" ] }, - "1333": { - "op": "log", + "1363": { + "op": "frame_bury 1", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0", + "next_list#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "maybe_exists%4#0" ] }, - "1334": { - "op": "err" - }, - "1335": { - "block": "add_label_to_asset_after_if_else@19", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], + "1365": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label#0 (copy)" + "label_idx#0", + "maybe_value%4#0" ] }, - "1337": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "op": "callsub operator_only", + "1366": { + "op": "intc_1 // 0", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "0" ] }, - "1340": { - "op": "frame_dig -1", + "1367": { + "op": "extract_uint16", "defined_out": [ - "asset#0 (copy)" + "array_length%0#0", + "maybe_value%4#0", + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "asset#0 (copy)" + "label_idx#0", + "array_length%0#0" ] }, - "1342": { - "op": "itob", + "1368": { + "op": "frame_bury 5", "defined_out": [ - "tmp%1#0" + "array_length%0#0", + "maybe_value%4#0", + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0" + "label_idx#0" ] }, - "1343": { - "op": "dup", + "1370": { + "op": "intc_1 // 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "next_list#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "tmp%1#0" + "label_idx#0", + "idx#0" ] }, - "1344": { - "op": "frame_bury 1", + "1371": { + "op": "frame_bury 6", "defined_out": [ - "tmp%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0" + "label_idx#0" ] }, - "1346": { - "op": "box_len", + "1373": { + "block": "remove_operator_from_label_for_header@11", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig 6", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" + "idx#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0" + "label_idx#0", + "idx#0" ] }, - "1347": { - "op": "bury 1", + "1375": { + "op": "frame_dig 5", + "defined_out": [ + "array_length%0#0", + "idx#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "maybe_exists%1#0" + "label_idx#0", + "idx#0", + "array_length%0#0" ] }, - "1349": { - "op": "bz add_label_to_asset_else_body@2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "1377": { + "op": "<", + "defined_out": [ "array_length%0#0", + "continue_looping%0#0", "idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "continue_looping%0#0" ] }, - "1352": { - "op": "frame_dig 1", + "1378": { + "op": "bz remove_operator_from_label_after_for@16", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0" + "label_idx#0" ] }, - "1354": { - "op": "box_len", + "1381": { + "op": "frame_dig 1", "defined_out": [ - "maybe_exists%0#1", - "maybe_value%0#0", - "tmp%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "maybe_value%0#0", - "maybe_exists%0#1" + "label_idx#0", + "maybe_value%4#0" ] }, - "1355": { - "op": "bury 1", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "1383": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0", "array_length%0#0", "idx#0", - "maybe_exists%0#1" + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "array_head_and_tail%0#0" ] }, - "1357": { - "op": "bnz add_label_to_asset_after_if_else@6", + "1386": { + "op": "frame_dig 6", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", + "idx#0", + "label_idx#0", + "array_head_and_tail%0#0", "idx#0" ] }, - "1360": { - "op": "intc 4 // 4294967296", + "1388": { + "op": "dup", "defined_out": [ - "tmp%1#0", - "tmp%3#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "idx#0 (copy)", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%3#0" + "label_idx#0", + "array_head_and_tail%0#0", + "idx#0 (copy)", + "idx#0 (copy)" ] }, - "1362": { - "block": "add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0" - ], - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295", - "tmp%3#0" - ], + "1389": { + "op": "cover 2", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%3#0", - "4294967295" + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0 (copy)" ] }, - "1363": { - "op": "==", + "1391": { + "op": "intc_2 // 2", "defined_out": [ - "cond#0" + "2", + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "idx#0 (copy)", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "cond#0" + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0 (copy)", + "2" ] }, - "1364": { - "op": "bnz add_label_to_asset_after_if_else@15", + "1392": { + "op": "*", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%4#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0" ] }, - "1367": { - "op": "bytec 4 // \"ERR:EXISTS\"", + "1393": { + "op": "dig 1", "defined_out": [ - "\"ERR:EXISTS\"" + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "\"ERR:EXISTS\"" + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" ] }, - "1369": { - "op": "log", + "1395": { + "op": "swap", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" ] }, - "1370": { - "op": "err" - }, - "1371": { - "block": "add_label_to_asset_after_if_else@15", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 1", + "1396": { + "op": "extract_uint16", "defined_out": [ - "tmp%1#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0" + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" ] }, - "1373": { - "op": "dup", + "1397": { + "op": "dup2", "defined_out": [ - "tmp%1#0", - "tmp%1#0 (copy)" + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "tmp%1#0 (copy)" + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" ] }, - "1374": { - "op": "box_get", + "1398": { + "op": "extract_uint16", "defined_out": [ - "existing#0", - "maybe_exists%2#0", - "tmp%1#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_length%0#0", + "item_offset%0#0", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "maybe_exists%2#0" + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" ] }, - "1375": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", + "1399": { + "op": "intc_2 // 2", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0" + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" ] }, - "1376": { - "op": "frame_dig -2", + "1400": { + "op": "+", "defined_out": [ - "existing#0", - "label#0 (copy)", - "tmp%1#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "maybe_value%4#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "label#0 (copy)" + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" ] }, - "1378": { - "op": "len", + "1401": { + "op": "extract3", "defined_out": [ - "existing#0", - "length%0#0", - "tmp%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "stored_label#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "length%0#0" + "label_idx#0", + "idx#0", + "stored_label#0" ] }, - "1379": { - "op": "itob", + "1402": { + "op": "frame_bury 4", "defined_out": [ - "as_bytes%0#0", - "existing#0", - "tmp%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "stored_label#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "as_bytes%0#0" + "label_idx#0", + "idx#0" ] }, - "1380": { - "op": "extract 6 2", + "1404": { + "op": "frame_dig 7", "defined_out": [ - "existing#0", - "length_uint16%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "length_uint16%0#0" - ] - }, - "1383": { - "op": "frame_dig -2", + "label_idx#0", + "maybe_value%4#0", + "stored_label#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "length_uint16%0#0", - "label#0 (copy)" + "label_idx#0", + "idx#0", + "label_idx#0" ] }, - "1385": { - "op": "concat", + "1406": { + "op": "!=", "defined_out": [ - "encoded_value%0#0", - "existing#0", - "tmp%1#0" + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "stored_label#0", + "tmp%15#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "encoded_value%0#0" + "label_idx#0", + "tmp%15#0" ] }, - "1386": { - "op": "intc_0 // 1", + "1407": { + "op": "frame_dig 2", "defined_out": [ - "1", - "encoded_value%0#0", - "existing#0", - "tmp%1#0" + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#9", + "stored_label#0", + "tmp%15#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "encoded_value%0#0", - "1" + "label_idx#0", + "tmp%15#0", + "next_list#9" ] }, - "1387": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", + "1409": { + "op": "frame_bury 3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#9", + "stored_label#0", + "tmp%15#0" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0" + "label_idx#0", + "tmp%15#0" ] }, - "1390": { - "op": "dig 1", + "1411": { + "op": "bz remove_operator_from_label_after_if_else@14", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "tmp%1#0 (copy)" + "label_idx#0" ] }, - "1392": { - "op": "box_del", + "1414": { + "op": "frame_dig 2", "defined_out": [ - "existing#0", - "tmp%1#0", - "{box_del}" + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0", - "{box_del}" + "label_idx#0", + "next_list#0" ] }, - "1393": { - "op": "pop", + "1416": { + "op": "frame_dig 4", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "existing#0" + "label_idx#0", + "next_list#0", + "stored_label#0" ] }, - "1394": { - "op": "box_put", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1395": { - "block": "add_label_to_asset_after_if_else@3", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig -2", + "1418": { + "op": "intc_0 // 1", "defined_out": [ - "label#0 (copy)" + "1", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label#0 (copy)" + "label_idx#0", + "next_list#0", + "stored_label#0", + "1" ] }, - "1397": { - "op": "box_get", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%3#0" - ], + "1419": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "maybe_exists%3#0" + "label_idx#0", + "next_list#9" ] }, - "1398": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", + "1422": { + "op": "frame_bury 3", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0" + "label_idx#0" ] }, - "1399": { - "op": "dup", - "defined_out": [ + "1424": { + "block": "remove_operator_from_label_after_if_else@14", + "stack_in": [ "label_descriptor#0", - "label_descriptor#0 (copy)" + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)" + "label_idx#0", + "next_list#0" ] }, - "1400": { - "op": "intc_2 // 2", + "1426": { + "op": "frame_bury 2", "defined_out": [ - "2", - "label_descriptor#0", - "label_descriptor#0 (copy)" + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)", - "2" + "label_idx#0" ] }, - "1401": { - "op": "extract_uint64", + "1428": { + "op": "frame_dig 6", "defined_out": [ - "label_descriptor#0", - "tmp%13#0" + "idx#0", + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "tmp%13#0" + "label_idx#0", + "idx#0" ] }, - "1402": { + "1430": { "op": "intc_0 // 1", "defined_out": [ "1", - "label_descriptor#0", - "tmp%13#0" + "idx#0", + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "tmp%13#0", + "label_idx#0", + "idx#0", "1" ] }, - "1403": { + "1431": { "op": "+", - "defined_out": [ - "label_descriptor#0", - "to_encode%0#0" - ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "to_encode%0#0" + "label_idx#0", + "idx#0" ] }, - "1404": { - "op": "itob", + "1432": { + "op": "frame_bury 6", "defined_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" + "idx#0", + "next_list#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "val_as_bytes%0#0" + "label_idx#0" ] }, - "1405": { - "op": "replace2 2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "1434": { + "op": "b remove_operator_from_label_for_header@11" + }, + "1437": { + "block": "remove_operator_from_label_after_for@16", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0" - ] - }, - "1407": { + "label_idx#0" + ], "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "label#0 (copy)" + "label_idx#0", + "operator#0 (copy)" ] }, - "1409": { + "1439": { "op": "box_del", "defined_out": [ - "label_descriptor#0", "{box_del}" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", + "label_idx#0", "{box_del}" ] }, - "1410": { + "1440": { "op": "pop", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0" + "label_idx#0" ] }, - "1411": { + "1441": { "op": "frame_dig -2", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label_descriptor#0", - "label#0 (copy)" + "label_idx#0", + "operator#0 (copy)" ] }, - "1413": { - "op": "swap", + "1443": { + "op": "frame_dig 2", + "defined_out": [ + "next_list#0", + "operator#0 (copy)" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "label#0 (copy)", - "label_descriptor#0" + "label_idx#0", + "operator#0 (copy)", + "next_list#0" ] }, - "1414": { + "1445": { "op": "box_put", "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0" ] }, - "1415": { + "1446": { "retsub": true, "op": "retsub" }, - "1416": { - "block": "add_label_to_asset_after_if_else@6", + "1447": { + "block": "remove_operator_from_label_bool_false@7", "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", - "idx#0" + "idx#0", + "label_idx#0" ], - "op": "frame_dig 1", + "op": "intc_1 // 0", "defined_out": [ - "tmp%1#0" + "cond#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "tmp%1#0" + "label_idx#0", + "cond#0" ] }, - "1418": { - "op": "box_get", + "1448": { + "op": "b remove_operator_from_label_bool_merge@8" + }, + "1451": { + "block": "remove_operator_from_label_bool_false@3", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "intc_1 // 0", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#1", - "tmp%1#0" + "cond#0" ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", "array_length%0#0", "idx#0", - "maybe_value%1#1", - "maybe_exists%1#0" + "label_idx#0", + "cond#0" ] }, - "1419": { - "op": "swap", + "1452": { + "op": "b remove_operator_from_label_bool_merge@4" + }, + "1455": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", + "params": { + "operator#0": "bytes" + }, + "block": "get_operator_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "1458": { + "op": "frame_dig -1", + "defined_out": [ + "operator#0 (copy)" + ], "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", + "operator#0 (copy)" + ] + }, + "1460": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1461": { + "op": "bury 1", + "stack_out": [ + "maybe_exists%0#0" + ] + }, + "1463": { + "op": "bz get_operator_labels_after_if_else@2", + "stack_out": [] + }, + "1466": { + "op": "frame_dig -1", + "stack_out": [ + "operator#0 (copy)" + ] + }, + "1468": { + "op": "box_get", + "defined_out": [ "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1469": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "1470": { + "retsub": true, + "op": "retsub" + }, + "1471": { + "block": "get_operator_labels_after_if_else@2", + "stack_in": [], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "0x0000" + ], + "stack_out": [ + "0x0000" + ] + }, + "1472": { + "retsub": true, + "op": "retsub" + }, + "1473": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", + "params": { + "label#0": "bytes", + "asset#0": "uint64" + }, + "block": "add_label_to_asset", + "stack_in": [], + "op": "proto 2 0" + }, + "1476": { + "op": "intc_1 // 0", + "stack_out": [ "maybe_value%1#1" ] }, - "1420": { + "1477": { "op": "dup", "stack_out": [ "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0", - "maybe_value%1#1", - "maybe_value%1#1 (copy)" + "tmp%1#0" ] }, - "1421": { - "op": "cover 2", + "1478": { + "op": "bytec_1 // \"\"", "stack_out": [ "maybe_value%1#1", "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "maybe_exists%1#0", - "maybe_value%1#1" + "array_length%0#0" ] }, - "1423": { - "op": "frame_bury 0", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#1", - "tmp%1#0" - ], + "1479": { + "op": "dup", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "maybe_exists%1#0" + "idx#0" ] }, - "1425": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", + "1480": { + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "maybe_value%1#1" + "label#0 (copy)" ] }, - "1426": { - "op": "intc_1 // 0", + "1482": { + "op": "box_len", "defined_out": [ - "0", - "maybe_value%1#1", - "tmp%1#0" + "cond#0", + "maybe_value%0#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "maybe_value%1#1", - "0" + "maybe_value%0#0", + "cond#0" ] }, - "1427": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0", - "maybe_value%1#1", - "tmp%1#0" - ], + "1483": { + "op": "bury 1", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_length%0#0" + "cond#0" ] }, - "1428": { - "op": "frame_bury 2", - "defined_out": [ - "array_length%0#0", - "maybe_value%1#1", - "tmp%1#0" - ], + "1485": { + "op": "bnz add_label_to_asset_after_if_else@19", "stack_out": [ "maybe_value%1#1", "tmp%1#0", @@ -8511,30 +8905,21 @@ "idx#0" ] }, - "1430": { - "op": "intc_1 // 0", + "1488": { + "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%1#0" + "\"ERR:NOEXIST\"" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "idx#0" + "\"ERR:NOEXIST\"" ] }, - "1431": { - "op": "frame_bury 3", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%1#0" - ], + "1489": { + "op": "log", "stack_out": [ "maybe_value%1#1", "tmp%1#0", @@ -8542,448 +8927,497 @@ "idx#0" ] }, - "1433": { - "block": "add_label_to_asset_for_header@7", + "1490": { + "op": "err" + }, + "1491": { + "block": "add_label_to_asset_after_if_else@19", "stack_in": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0" ], - "op": "frame_dig 3", + "op": "frame_dig -2", "defined_out": [ - "idx#0" + "label#0 (copy)" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "idx#0" + "label#0 (copy)" ] }, - "1435": { - "op": "frame_dig 2", - "defined_out": [ + "1493": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "op": "callsub operator_only", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", "array_length%0#0", "idx#0" + ] + }, + "1496": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "idx#0", - "array_length%0#0" + "asset#0 (copy)" ] }, - "1437": { - "op": "<", + "1498": { + "op": "itob", "defined_out": [ - "array_length%0#0", - "continue_looping%0#0", - "idx#0" + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "continue_looping%0#0" + "tmp%1#0" ] }, - "1438": { - "op": "bz add_label_to_asset_after_for@11", + "1499": { + "op": "dup", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0" + "idx#0", + "tmp%1#0", + "tmp%1#0" ] }, - "1441": { - "op": "frame_dig 0", + "1500": { + "op": "frame_bury 1", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1" + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "maybe_value%1#1" + "tmp%1#0" ] }, - "1443": { - "op": "extract 2 0", + "1502": { + "op": "box_len", "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1" + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0" + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "1446": { - "op": "frame_dig 3", + "1503": { + "op": "bury 1", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "idx#0" + "maybe_exists%1#0" ] }, - "1448": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_head_and_tail%0#0", + "1505": { + "op": "bz add_label_to_asset_else_body@2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", "array_length%0#0", - "idx#0", - "maybe_value%1#1" - ], + "idx#0" + ] + }, + "1508": { + "op": "frame_dig 1", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "idx#0", - "2" + "tmp%1#0" ] }, - "1449": { - "op": "*", + "1510": { + "op": "box_len", "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#1" + "maybe_exists%0#1", + "maybe_value%0#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0" + "maybe_value%0#0", + "maybe_exists%0#1" ] }, - "1450": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#1" - ], + "1511": { + "op": "bury 1", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0", - "array_head_and_tail%0#0 (copy)" + "maybe_exists%0#1" ] }, - "1452": { - "op": "swap", + "1513": { + "op": "bnz add_label_to_asset_after_if_else@6", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset_offset%0#0" + "idx#0" ] }, - "1453": { - "op": "extract_uint16", + "1516": { + "op": "intc 4 // 4294967296", "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "maybe_value%1#1" + "tmp%1#0", + "tmp%3#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" + "tmp%3#0" ] }, - "1454": { - "op": "dup2", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", + "1518": { + "block": "add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", "array_length%0#0", "idx#0", - "item_offset%0#0", - "item_offset%0#0 (copy)", - "maybe_value%1#1" + "tmp%3#0" + ], + "op": "intc_3 // 4294967295", + "defined_out": [ + "4294967295", + "tmp%3#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" + "tmp%3#0", + "4294967295" ] }, - "1455": { - "op": "extract_uint16", + "1519": { + "op": "==", "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_length%0#0", - "item_offset%0#0", - "maybe_value%1#1" + "cond#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" + "cond#0" ] }, - "1456": { - "op": "intc_2 // 2", + "1520": { + "op": "bnz add_label_to_asset_after_if_else@15", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" + "idx#0" ] }, - "1457": { - "op": "+", + "1523": { + "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_head_tail_length%0#0", - "item_offset%0#0", - "maybe_value%1#1" + "\"ERR:EXISTS\"" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" + "\"ERR:EXISTS\"" ] }, - "1458": { - "op": "extract3", - "defined_out": [ + "1525": { + "op": "log", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", "array_length%0#0", - "idx#0", + "idx#0" + ] + }, + "1526": { + "op": "err" + }, + "1527": { + "block": "add_label_to_asset_after_if_else@15", + "stack_in": [ "maybe_value%1#1", - "stored_label#0" + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "stored_label#0" + "tmp%1#0" ] }, - "1459": { - "op": "extract 2 0", + "1529": { + "op": "dup", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%4#1" + "tmp%1#0", + "tmp%1#0 (copy)" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "tmp%4#1" + "tmp%1#0", + "tmp%1#0 (copy)" ] }, - "1462": { - "op": "frame_dig -2", + "1530": { + "op": "box_get", "defined_out": [ + "existing#0", + "maybe_exists%2#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", "array_length%0#0", "idx#0", - "label#0 (copy)", + "tmp%1#0", + "existing#0", + "maybe_exists%2#0" + ] + }, + "1531": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ "maybe_value%1#1", - "tmp%4#1" + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0" + ] + }, + "1532": { + "op": "frame_dig -2", + "defined_out": [ + "existing#0", + "label#0 (copy)", + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "tmp%4#1", + "tmp%1#0", + "existing#0", "label#0 (copy)" ] }, - "1464": { - "op": "==", + "1534": { + "op": "len", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%5#1" + "existing#0", + "length%0#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "tmp%5#1" + "tmp%1#0", + "existing#0", + "length%0#0" ] }, - "1465": { - "op": "bz add_label_to_asset_after_if_else@10", + "1535": { + "op": "itob", + "defined_out": [ + "as_bytes%0#0", + "existing#0", + "tmp%1#0" + ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0" + "idx#0", + "tmp%1#0", + "existing#0", + "as_bytes%0#0" ] }, - "1468": { - "op": "frame_dig 3", + "1536": { + "op": "extract 6 2", "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%3#0" + "existing#0", + "length_uint16%0#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "tmp%3#0" + "tmp%1#0", + "existing#0", + "length_uint16%0#0" ] }, - "1470": { - "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" - }, - "1473": { - "block": "add_label_to_asset_after_if_else@10", - "stack_in": [ + "1539": { + "op": "frame_dig -2", + "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 3", + "idx#0", + "tmp%1#0", + "existing#0", + "length_uint16%0#0", + "label#0 (copy)" + ] + }, + "1541": { + "op": "concat", "defined_out": [ - "idx#0" + "encoded_value%0#0", + "existing#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "idx#0" + "tmp%1#0", + "existing#0", + "encoded_value%0#0" ] }, - "1475": { + "1542": { "op": "intc_0 // 1", "defined_out": [ "1", - "idx#0" + "encoded_value%0#0", + "existing#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "idx#0", + "tmp%1#0", + "existing#0", + "encoded_value%0#0", "1" ] }, - "1476": { - "op": "+", + "1543": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "idx#0" + "tmp%1#0", + "existing#0" ] }, - "1477": { - "op": "frame_bury 3", - "defined_out": [ - "idx#0" - ], + "1546": { + "op": "dig 1", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0" + "idx#0", + "tmp%1#0", + "existing#0", + "tmp%1#0 (copy)" ] }, - "1479": { - "op": "b add_label_to_asset_for_header@7" - }, - "1482": { - "block": "add_label_to_asset_after_for@11", - "stack_in": [ + "1548": { + "op": "box_del", + "defined_out": [ + "existing#0", + "tmp%1#0", + "{box_del}" + ], + "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0" - ], - "op": "intc_3 // 4294967295", - "defined_out": [ - "tmp%3#0" - ], + "idx#0", + "tmp%1#0", + "existing#0", + "{box_del}" + ] + }, + "1549": { + "op": "pop", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "tmp%3#0" + "tmp%1#0", + "existing#0" ] }, - "1483": { - "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" + "1550": { + "op": "box_put", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] }, - "1486": { - "block": "add_label_to_asset_else_body@2", + "1551": { + "block": "add_label_to_asset_after_if_else@3", "stack_in": [ "maybe_value%1#1", "tmp%1#0", @@ -9002,1047 +9436,1102 @@ "label#0 (copy)" ] }, - "1488": { - "op": "len", + "1553": { + "op": "box_get", "defined_out": [ - "length%1#0" + "label_descriptor#0", + "maybe_exists%3#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "length%1#0" + "label_descriptor#0", + "maybe_exists%3#0" ] }, - "1489": { - "op": "itob", - "defined_out": [ - "as_bytes%1#0" - ], + "1554": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "as_bytes%1#0" + "label_descriptor#0" ] }, - "1490": { - "op": "extract 6 2", + "1555": { + "op": "dup", "defined_out": [ - "length_uint16%1#0" + "label_descriptor#0", + "label_descriptor#0 (copy)" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "length_uint16%1#0" + "label_descriptor#0", + "label_descriptor#0 (copy)" ] }, - "1493": { - "op": "frame_dig -2", + "1556": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "length_uint16%1#0", - "label#0 (copy)" + "label_descriptor#0", + "label_descriptor#0 (copy)", + "2" ] }, - "1495": { - "op": "concat", + "1557": { + "op": "extract_uint64", "defined_out": [ - "encoded_value%1#0" + "label_descriptor#0", + "tmp%13#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "encoded_value%1#0" + "label_descriptor#0", + "tmp%13#0" ] }, - "1496": { - "op": "bytec 9 // 0x0002", + "1558": { + "op": "intc_0 // 1", "defined_out": [ - "0x0002", - "encoded_value%1#0" + "1", + "label_descriptor#0", + "tmp%13#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "encoded_value%1#0", - "0x0002" + "label_descriptor#0", + "tmp%13#0", + "1" ] }, - "1498": { - "op": "swap", + "1559": { + "op": "+", + "defined_out": [ + "label_descriptor#0", + "to_encode%0#0" + ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "0x0002", - "encoded_value%1#0" + "label_descriptor#0", + "to_encode%0#0" ] }, - "1499": { - "op": "concat", + "1560": { + "op": "itob", "defined_out": [ - "result%1#0" + "label_descriptor#0", + "val_as_bytes%0#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "result%1#0" + "label_descriptor#0", + "val_as_bytes%0#0" ] }, - "1500": { - "op": "bytec 10 // 0x0001", - "defined_out": [ - "0x0001", - "result%1#0" - ], + "1561": { + "op": "replace2 2", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "result%1#0", - "0x0001" + "label_descriptor#0" ] }, - "1502": { - "op": "swap", + "1563": { + "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "0x0001", - "result%1#0" + "label_descriptor#0", + "label#0 (copy)" ] }, - "1503": { - "op": "concat", + "1565": { + "op": "box_del", "defined_out": [ - "array_data%0#0" + "label_descriptor#0", + "{box_del}" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_data%0#0" + "label_descriptor#0", + "{box_del}" ] }, - "1504": { - "op": "frame_dig 1", - "defined_out": [ - "array_data%0#0", - "tmp%1#0" - ], + "1566": { + "op": "pop", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_data%0#0", - "tmp%1#0" + "label_descriptor#0" ] }, - "1506": { - "op": "dup", - "defined_out": [ - "array_data%0#0", + "1567": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%1#1", "tmp%1#0", - "tmp%1#0 (copy)" - ], + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1569": { + "op": "swap", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_data%0#0", + "label#0 (copy)", + "label_descriptor#0" + ] + }, + "1570": { + "op": "box_put", + "stack_out": [ + "maybe_value%1#1", "tmp%1#0", - "tmp%1#0 (copy)" + "array_length%0#0", + "idx#0" ] }, - "1507": { - "op": "box_del", - "defined_out": [ - "array_data%0#0", + "1571": { + "retsub": true, + "op": "retsub" + }, + "1572": { + "block": "add_label_to_asset_after_if_else@6", + "stack_in": [ + "maybe_value%1#1", "tmp%1#0", - "{box_del}" + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "tmp%1#0" ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_data%0#0", - "tmp%1#0", - "{box_del}" + "tmp%1#0" ] }, - "1508": { - "op": "pop", + "1574": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#1", + "tmp%1#0" + ], "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "array_data%0#0", - "tmp%1#0" + "maybe_value%1#1", + "maybe_exists%1#0" ] }, - "1509": { + "1575": { "op": "swap", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", "idx#0", - "tmp%1#0", - "array_data%0#0" + "maybe_exists%1#0", + "maybe_value%1#1" ] }, - "1510": { - "op": "box_put", + "1576": { + "op": "dup", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0", - "idx#0" + "idx#0", + "maybe_exists%1#0", + "maybe_value%1#1", + "maybe_value%1#1 (copy)" ] }, - "1511": { - "op": "b add_label_to_asset_after_if_else@3" - }, - "1514": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", - "params": { - "label#0": "bytes", - "asset#0": "uint64" - }, - "block": "remove_label_from_asset", - "stack_in": [], - "op": "proto 2 0" - }, - "1517": { - "op": "intc_1 // 0", + "1577": { + "op": "cover 2", "stack_out": [ - "maybe_value%3#0" + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "maybe_exists%1#0", + "maybe_value%1#1" ] }, - "1518": { - "op": "dupn 3", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "1579": { + "op": "frame_bury 0", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#1", "tmp%1#0" - ] - }, - "1520": { - "op": "bytec_2 // \"\"", + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "maybe_exists%1#0" ] }, - "1521": { - "op": "dupn 2", + "1581": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" + "array_length%0#0", + "idx#0", + "maybe_value%1#1" ] }, - "1523": { - "op": "frame_dig -2", + "1582": { + "op": "intc_1 // 0", "defined_out": [ - "label#0 (copy)" + "0", + "maybe_value%1#1", + "tmp%1#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "label#0 (copy)" + "maybe_value%1#1", + "0" ] }, - "1525": { - "op": "box_len", + "1583": { + "op": "extract_uint16", "defined_out": [ - "cond#1", - "maybe_value%0#0" + "array_length%0#0", + "maybe_value%1#1", + "tmp%1#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%0#0", - "cond#1" + "array_length%0#0" ] }, - "1526": { - "op": "bury 1", + "1584": { + "op": "frame_bury 2", + "defined_out": [ + "array_length%0#0", + "maybe_value%1#1", + "tmp%1#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "cond#1" + "array_length%0#0", + "idx#0" ] }, - "1528": { - "op": "bnz remove_label_from_asset_after_if_else@20", + "1586": { + "op": "intc_1 // 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%1#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", + "idx#0", "idx#0" ] }, - "1531": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "1587": { + "op": "frame_bury 3", "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1532": { - "op": "log", + "maybe_value%1#1", + "tmp%1#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0" ] }, - "1533": { - "op": "err" - }, - "1534": { - "block": "remove_label_from_asset_after_if_else@20", + "1589": { + "block": "add_label_to_asset_for_header@7", "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0" ], - "op": "frame_dig -2", + "op": "frame_dig 3", "defined_out": [ - "label#0 (copy)" + "idx#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "label#0 (copy)" + "idx#0" ] }, - "1536": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "op": "callsub operator_only", + "1591": { + "op": "frame_dig 2", + "defined_out": [ + "array_length%0#0", + "idx#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" + "array_length%0#0", + "idx#0", + "idx#0", + "array_length%0#0" ] }, - "1539": { - "op": "intc_1 // 0", + "1593": { + "op": "<", "defined_out": [ - "found#0" + "array_length%0#0", + "continue_looping%0#0", + "idx#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "found#0" + "continue_looping%0#0" ] }, - "1540": { - "op": "frame_bury 5", - "defined_out": [ - "found#0" - ], + "1594": { + "op": "bz add_label_to_asset_after_for@11", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0" ] }, - "1542": { - "op": "frame_dig -1", + "1597": { + "op": "frame_dig 0", "defined_out": [ - "asset#0 (copy)", - "found#0" + "array_length%0#0", + "idx#0", + "maybe_value%1#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "asset#0 (copy)" + "maybe_value%1#1" ] }, - "1544": { - "op": "itob", + "1599": { + "op": "extract 2 0", "defined_out": [ - "found#0", - "tmp%1#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%1#0" + "array_head_and_tail%0#0" ] }, - "1545": { - "op": "dup", + "1602": { + "op": "frame_dig 3", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%1#0", - "tmp%1#0" + "array_head_and_tail%0#0", + "idx#0" ] }, - "1546": { - "op": "frame_bury 3", + "1604": { + "op": "intc_2 // 2", "defined_out": [ - "found#0", - "tmp%1#0" + "2", + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%1#0" + "array_head_and_tail%0#0", + "idx#0", + "2" ] }, - "1548": { - "op": "box_get", + "1605": { + "op": "*", "defined_out": [ - "found#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0" + "array_head_and_tail%0#0", + "item_offset_offset%0#0" ] }, - "1549": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", + "1606": { + "op": "dig 1", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#1" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%1#0" + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" ] }, - "1550": { - "op": "intc_1 // 0", + "1608": { + "op": "swap", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%1#0", - "0" + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" ] }, - "1551": { + "1609": { "op": "extract_uint16", "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%3#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "maybe_value%1#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%3#0" + "array_head_and_tail%0#0", + "item_offset%0#0" ] }, - "1552": { - "op": "intc_0 // 1", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%3#0", - "1" - ] - }, - "1553": { - "op": "==", + "1610": { + "op": "dup2", "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%4#0" + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", + "maybe_value%1#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%4#0" + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" ] }, - "1554": { - "op": "bz remove_label_from_asset_else_body@5", + "1611": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_length%0#0", + "item_offset%0#0", + "maybe_value%1#1" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" ] }, - "1557": { - "op": "frame_dig 3", + "1612": { + "op": "intc_2 // 2", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%1#0" + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" ] }, - "1559": { - "op": "box_get", + "1613": { + "op": "+", "defined_out": [ - "found#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "tmp%1#0" + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "maybe_value%1#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%2#0", - "maybe_exists%2#0" + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" ] }, - "1560": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", + "1614": { + "op": "extract3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "stored_label#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%2#0" + "stored_label#0" ] }, - "1561": { - "op": "dup", + "1615": { + "op": "extract 2 0", "defined_out": [ - "found#0", - "maybe_value%2#0", - "maybe_value%2#0 (copy)", - "tmp%1#0" + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%4#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%2#0", - "maybe_value%2#0 (copy)" + "tmp%4#1" ] }, - "1562": { - "op": "extract 2 0", + "1618": { + "op": "frame_dig -2", "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "maybe_value%2#0", - "tmp%1#0" + "array_length%0#0", + "idx#0", + "label#0 (copy)", + "maybe_value%1#1", + "tmp%4#1" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "maybe_value%2#0", - "array_head_and_tail%0#0" + "tmp%4#1", + "label#0 (copy)" ] }, - "1565": { - "op": "swap", + "1620": { + "op": "==", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%5#1" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "maybe_value%2#0" + "tmp%5#1" ] }, - "1566": { - "op": "intc_1 // 0", + "1621": { + "op": "bz add_label_to_asset_after_if_else@10", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "maybe_value%2#0", - "0" + "array_length%0#0", + "idx#0" ] }, - "1567": { - "op": "extract_uint16", + "1624": { + "op": "frame_dig 3", "defined_out": [ - "array_head_and_tail%0#0", "array_length%0#0", - "found#0", - "tmp%1#0" + "idx#0", + "maybe_value%1#1", + "tmp%3#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "array_length%0#0" + "tmp%3#0" ] }, - "1568": { - "error": "Index access is out of bounds", - "op": "assert // Index access is out of bounds", + "1626": { + "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" + }, + "1629": { + "block": "add_label_to_asset_after_if_else@10", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "idx#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0" + "idx#0" ] }, - "1569": { - "op": "dup", + "1631": { + "op": "intc_0 // 1", "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "found#0", - "tmp%1#0" + "1", + "idx#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1570": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "0" + "1" ] }, - "1571": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "item_offset%0#0", - "tmp%1#0" - ], + "1632": { + "op": "+", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" + "idx#0" ] }, - "1572": { - "op": "dup2", + "1633": { + "op": "frame_bury 3", "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "found#0", - "item_offset%0#0", - "item_offset%0#0 (copy)", - "tmp%1#0" + "idx#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" + "array_length%0#0", + "idx#0" ] }, - "1573": { - "op": "extract_uint16", + "1635": { + "op": "b add_label_to_asset_for_header@7" + }, + "1638": { + "block": "add_label_to_asset_after_for@11", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "intc_3 // 4294967295", "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "item_length%0#0", - "item_offset%0#0", - "tmp%1#0" + "tmp%3#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" + "tmp%3#0" ] }, - "1574": { - "op": "intc_2 // 2", + "1639": { + "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" + }, + "1642": { + "block": "add_label_to_asset_else_body@2", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig -2", "defined_out": [ - "2", - "array_head_and_tail%0#0", - "found#0", - "item_length%0#0", - "item_offset%0#0", - "tmp%1#0" + "label#0 (copy)" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" + "label#0 (copy)" ] }, - "1575": { - "op": "+", + "1644": { + "op": "len", "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "item_head_tail_length%0#0", - "item_offset%0#0", - "tmp%1#0" + "length%1#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" + "length%1#0" ] }, - "1576": { - "op": "extract3", + "1645": { + "op": "itob", "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%7#0" + "as_bytes%1#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%7#0" + "as_bytes%1#0" ] }, - "1577": { - "op": "extract 2 0", + "1646": { + "op": "extract 6 2", "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%8#0" + "length_uint16%1#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%8#0" + "length_uint16%1#0" ] }, - "1580": { + "1649": { "op": "frame_dig -2", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%8#0", + "length_uint16%1#0", "label#0 (copy)" ] }, - "1582": { - "op": "==", + "1651": { + "op": "concat", "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%9#0" + "encoded_value%1#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%9#0" + "encoded_value%1#0" ] }, - "1583": { - "op": "bz remove_label_from_asset_else_body@3", + "1652": { + "op": "bytec 6 // 0x0002", + "defined_out": [ + "0x0002", + "encoded_value%1#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" + "array_length%0#0", + "idx#0", + "encoded_value%1#0", + "0x0002" ] }, - "1586": { - "op": "frame_dig 3", + "1654": { + "op": "swap", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "tmp%1#0" + "0x0002", + "encoded_value%1#0" ] }, - "1588": { - "op": "box_del", + "1655": { + "op": "concat", "defined_out": [ - "found#0", - "tmp%1#0", - "{box_del}" + "result%1#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", "idx#0", - "{box_del}" + "result%1#0" ] }, - "1589": { - "op": "pop", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", + "1656": { + "op": "bytec 11 // 0x0001", + "defined_out": [ + "0x0001", + "result%1#0" + ], + "stack_out": [ + "maybe_value%1#1", "tmp%1#0", - "array_length%1#0", - "found#0", + "array_length%0#0", + "idx#0", + "result%1#0", + "0x0001" + ] + }, + "1658": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "0x0001", + "result%1#0" + ] + }, + "1659": { + "op": "concat", + "defined_out": [ + "array_data%0#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0" + ] + }, + "1660": { + "op": "frame_dig 1", + "defined_out": [ + "array_data%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0" + ] + }, + "1662": { + "op": "dup", + "defined_out": [ + "array_data%0#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ] + }, + "1663": { + "op": "box_del", + "defined_out": [ + "array_data%0#0", + "tmp%1#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0", + "{box_del}" + ] + }, + "1664": { + "op": "pop", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0" + ] + }, + "1665": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "array_data%0#0" + ] + }, + "1666": { + "op": "box_put", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", "idx#0" ] }, - "1590": { - "op": "intc_0 // 1", + "1667": { + "op": "b add_label_to_asset_after_if_else@3" + }, + "1670": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", + "params": { + "label#0": "bytes", + "asset#0": "uint64" + }, + "block": "remove_label_from_asset", + "stack_in": [], + "op": "proto 2 0" + }, + "1673": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%3#0" + ] + }, + "1674": { + "op": "dupn 3", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0" + ] + }, + "1676": { + "op": "bytec_1 // \"\"", "stack_out": [ "maybe_value%3#0", "next_list#0", "stored_label#0", "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "found#0" + "array_length%1#0" ] }, - "1591": { - "op": "frame_bury 5", + "1677": { + "op": "dupn 2", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10053,20 +10542,27 @@ "idx#0" ] }, - "1593": { - "block": "remove_label_from_asset_after_if_else@13", - "stack_in": [ + "1679": { + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ "maybe_value%3#0", "next_list#0", "stored_label#0", "tmp%1#0", "array_length%1#0", "found#0", - "idx#0" - ], - "op": "frame_dig 5", + "idx#0", + "label#0 (copy)" + ] + }, + "1681": { + "op": "box_len", "defined_out": [ - "found#0" + "cond#1", + "maybe_value%0#0" ], "stack_out": [ "maybe_value%3#0", @@ -10076,11 +10572,25 @@ "array_length%1#0", "found#0", "idx#0", - "found#0" + "maybe_value%0#0", + "cond#1" ] }, - "1595": { - "op": "bnz remove_label_from_asset_after_if_else@16", + "1682": { + "op": "bury 1", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "cond#1" + ] + }, + "1684": { + "op": "bnz remove_label_from_asset_after_if_else@20", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10091,11 +10601,10 @@ "idx#0" ] }, - "1598": { + "1687": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ - "\"ERR:NOEXIST\"", - "found#0" + "\"ERR:NOEXIST\"" ], "stack_out": [ "maybe_value%3#0", @@ -10108,7 +10617,7 @@ "\"ERR:NOEXIST\"" ] }, - "1599": { + "1688": { "op": "log", "stack_out": [ "maybe_value%3#0", @@ -10120,11 +10629,11 @@ "idx#0" ] }, - "1600": { + "1689": { "op": "err" }, - "1601": { - "block": "remove_label_from_asset_after_if_else@16", + "1690": { + "block": "remove_label_from_asset_after_if_else@20", "stack_in": [ "maybe_value%3#0", "next_list#0", @@ -10149,12 +10658,9 @@ "label#0 (copy)" ] }, - "1603": { - "op": "box_get", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%4#0" - ], + "1692": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "op": "callsub operator_only", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10162,14 +10668,14 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "label_descriptor#0", - "maybe_exists%4#0" + "idx#0" ] }, - "1604": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", + "1695": { + "op": "intc_1 // 0", + "defined_out": [ + "found#0" + ], "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10178,14 +10684,13 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0" + "found#0" ] }, - "1605": { - "op": "dup", + "1696": { + "op": "frame_bury 5", "defined_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" + "found#0" ], "stack_out": [ "maybe_value%3#0", @@ -10194,17 +10699,14 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)" + "idx#0" ] }, - "1606": { - "op": "intc_2 // 2", + "1698": { + "op": "frame_dig -1", "defined_out": [ - "2", - "label_descriptor#0", - "label_descriptor#0 (copy)" + "asset#0 (copy)", + "found#0" ], "stack_out": [ "maybe_value%3#0", @@ -10214,16 +10716,14 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)", - "2" + "asset#0 (copy)" ] }, - "1607": { - "op": "extract_uint64", + "1700": { + "op": "itob", "defined_out": [ - "label_descriptor#0", - "tmp%20#0" + "found#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%3#0", @@ -10233,17 +10733,11 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0", - "tmp%20#0" + "tmp%1#0" ] }, - "1608": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "label_descriptor#0", - "tmp%20#0" - ], + "1701": { + "op": "dup", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10252,16 +10746,15 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0", - "tmp%20#0", - "1" + "tmp%1#0", + "tmp%1#0" ] }, - "1609": { - "op": "-", + "1702": { + "op": "frame_bury 3", "defined_out": [ - "label_descriptor#0", - "to_encode%0#0" + "found#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%3#0", @@ -10271,15 +10764,16 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0", - "to_encode%0#0" + "tmp%1#0" ] }, - "1610": { - "op": "itob", + "1704": { + "op": "box_get", "defined_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" + "found#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%3#0", @@ -10289,12 +10783,13 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0", - "val_as_bytes%0#0" + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "1611": { - "op": "replace2 2", + "1705": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10303,11 +10798,11 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0" + "maybe_value%1#0" ] }, - "1613": { - "op": "frame_dig -2", + "1706": { + "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10316,15 +10811,16 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0", - "label#0 (copy)" + "maybe_value%1#0", + "0" ] }, - "1615": { - "op": "box_del", + "1707": { + "op": "extract_uint16", "defined_out": [ - "label_descriptor#0", - "{box_del}" + "found#0", + "tmp%1#0", + "tmp%3#0" ], "stack_out": [ "maybe_value%3#0", @@ -10334,12 +10830,11 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0", - "{box_del}" + "tmp%3#0" ] }, - "1616": { - "op": "pop", + "1708": { + "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10348,25 +10843,17 @@ "array_length%1#0", "found#0", "idx#0", - "label_descriptor#0" + "tmp%3#0", + "1" ] }, - "1617": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", + "1709": { + "op": "==", + "defined_out": [ "found#0", - "idx#0", - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1619": { - "op": "swap", + "tmp%1#0", + "tmp%4#0" + ], "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10375,12 +10862,11 @@ "array_length%1#0", "found#0", "idx#0", - "label#0 (copy)", - "label_descriptor#0" + "tmp%4#0" ] }, - "1620": { - "op": "box_put", + "1710": { + "op": "bz remove_label_from_asset_else_body@5", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10391,25 +10877,8 @@ "idx#0" ] }, - "1621": { - "retsub": true, - "op": "retsub" - }, - "1622": { - "block": "remove_label_from_asset_else_body@3", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "intc_1 // 0", - "defined_out": [ - "found#0" - ], + "1713": { + "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10418,41 +10887,16 @@ "array_length%1#0", "found#0", "idx#0", - "found#0" + "tmp%1#0" ] }, - "1623": { - "op": "frame_bury 5", + "1715": { + "op": "box_get", "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1625": { - "op": "b remove_label_from_asset_after_if_else@13" - }, - "1628": { - "block": "remove_label_from_asset_else_body@5", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", "found#0", - "idx#0" - ], - "op": "bytec 11 // 0x0000", - "defined_out": [ - "next_list#0" + "maybe_exists%2#0", + "maybe_value%2#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%3#0", @@ -10462,14 +10906,13 @@ "array_length%1#0", "found#0", "idx#0", - "next_list#0" + "maybe_value%2#0", + "maybe_exists%2#0" ] }, - "1630": { - "op": "frame_bury 1", - "defined_out": [ - "next_list#0" - ], + "1716": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10477,13 +10920,16 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0" + "idx#0", + "maybe_value%2#0" ] }, - "1632": { - "op": "frame_dig 3", + "1717": { + "op": "dup", "defined_out": [ - "next_list#0", + "found#0", + "maybe_value%2#0", + "maybe_value%2#0 (copy)", "tmp%1#0" ], "stack_out": [ @@ -10494,15 +10940,16 @@ "array_length%1#0", "found#0", "idx#0", - "tmp%1#0" + "maybe_value%2#0", + "maybe_value%2#0 (copy)" ] }, - "1634": { - "op": "box_get", + "1718": { + "op": "extract 2 0", "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "next_list#0", + "array_head_and_tail%0#0", + "found#0", + "maybe_value%2#0", "tmp%1#0" ], "stack_out": [ @@ -10513,11 +10960,11 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_value%3#0", - "maybe_exists%3#0" + "maybe_value%2#0", + "array_head_and_tail%0#0" ] }, - "1635": { + "1721": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -10527,12 +10974,12 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_exists%3#0", - "maybe_value%3#0" + "array_head_and_tail%0#0", + "maybe_value%2#0" ] }, - "1636": { - "op": "dup", + "1722": { + "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10541,13 +10988,19 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "maybe_value%3#0 (copy)" + "array_head_and_tail%0#0", + "maybe_value%2#0", + "0" ] }, - "1637": { - "op": "cover 2", + "1723": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "found#0", + "tmp%1#0" + ], "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10556,19 +11009,13 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_value%3#0", - "maybe_exists%3#0", - "maybe_value%3#0" + "array_head_and_tail%0#0", + "array_length%0#0" ] }, - "1639": { - "op": "frame_bury 0", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "next_list#0", - "tmp%1#0" - ], + "1724": { + "error": "Index access is out of bounds", + "op": "assert // Index access is out of bounds", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10577,13 +11024,17 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_value%3#0", - "maybe_exists%3#0" + "array_head_and_tail%0#0" ] }, - "1641": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", + "1725": { + "op": "dup", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "found#0", + "tmp%1#0" + ], "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10592,10 +11043,11 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_value%3#0" + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)" ] }, - "1642": { + "1726": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -10605,16 +11057,17 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_value%3#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", "0" ] }, - "1643": { + "1727": { "op": "extract_uint16", "defined_out": [ - "array_length%1#0", - "maybe_value%3#0", - "next_list#0", + "array_head_and_tail%0#0", + "found#0", + "item_offset%0#0", "tmp%1#0" ], "stack_out": [ @@ -10625,15 +11078,18 @@ "array_length%1#0", "found#0", "idx#0", - "array_length%1#0" + "array_head_and_tail%0#0", + "item_offset%0#0" ] }, - "1644": { - "op": "frame_bury 4", + "1728": { + "op": "dup2", "defined_out": [ - "array_length%1#0", - "maybe_value%3#0", - "next_list#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "found#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", "tmp%1#0" ], "stack_out": [ @@ -10643,16 +11099,20 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0" - ] - }, - "1646": { - "op": "intc_1 // 0", - "defined_out": [ - "array_length%1#0", "idx#0", - "maybe_value%3#0", - "next_list#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" + ] + }, + "1729": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "found#0", + "item_length%0#0", + "item_offset%0#0", "tmp%1#0" ], "stack_out": [ @@ -10663,16 +11123,19 @@ "array_length%1#0", "found#0", "idx#0", - "idx#0" + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" ] }, - "1647": { - "op": "frame_bury 6", + "1730": { + "op": "intc_2 // 2", "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "next_list#0", + "2", + "array_head_and_tail%0#0", + "found#0", + "item_length%0#0", + "item_offset%0#0", "tmp%1#0" ], "stack_out": [ @@ -10682,23 +11145,21 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0" + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" ] }, - "1649": { - "block": "remove_label_from_asset_for_header@6", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig 6", + "1731": { + "op": "+", "defined_out": [ - "idx#0" + "array_head_and_tail%0#0", + "found#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%3#0", @@ -10708,14 +11169,17 @@ "array_length%1#0", "found#0", "idx#0", - "idx#0" + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" ] }, - "1651": { - "op": "frame_dig 4", + "1732": { + "op": "extract3", "defined_out": [ - "array_length%1#0", - "idx#0" + "found#0", + "tmp%1#0", + "tmp%7#0" ], "stack_out": [ "maybe_value%3#0", @@ -10725,16 +11189,15 @@ "array_length%1#0", "found#0", "idx#0", - "idx#0", - "array_length%1#0" + "tmp%7#0" ] }, - "1653": { - "op": "<", + "1733": { + "op": "extract 2 0", "defined_out": [ - "array_length%1#0", - "continue_looping%0#0", - "idx#0" + "found#0", + "tmp%1#0", + "tmp%8#0" ], "stack_out": [ "maybe_value%3#0", @@ -10744,11 +11207,11 @@ "array_length%1#0", "found#0", "idx#0", - "continue_looping%0#0" + "tmp%8#0" ] }, - "1654": { - "op": "bz remove_label_from_asset_after_for@12", + "1736": { + "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10756,15 +11219,17 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0" + "idx#0", + "tmp%8#0", + "label#0 (copy)" ] }, - "1657": { - "op": "frame_dig 0", + "1738": { + "op": "==", "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0" + "found#0", + "tmp%1#0", + "tmp%9#0" ], "stack_out": [ "maybe_value%3#0", @@ -10774,17 +11239,11 @@ "array_length%1#0", "found#0", "idx#0", - "maybe_value%3#0" + "tmp%9#0" ] }, - "1659": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "maybe_value%3#0" - ], + "1739": { + "op": "bz remove_label_from_asset_else_body@3", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10792,12 +11251,11 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "array_head_and_tail%1#0" + "idx#0" ] }, - "1662": { - "op": "frame_dig 6", + "1742": { + "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10806,18 +11264,15 @@ "array_length%1#0", "found#0", "idx#0", - "array_head_and_tail%1#0", - "idx#0" + "tmp%1#0" ] }, - "1664": { - "op": "intc_2 // 2", + "1744": { + "op": "box_del", "defined_out": [ - "2", - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "maybe_value%3#0" + "found#0", + "tmp%1#0", + "{box_del}" ], "stack_out": [ "maybe_value%3#0", @@ -10827,20 +11282,11 @@ "array_length%1#0", "found#0", "idx#0", - "array_head_and_tail%1#0", - "idx#0", - "2" + "{box_del}" ] }, - "1665": { - "op": "*", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "item_offset_offset%1#0", - "maybe_value%3#0" - ], + "1745": { + "op": "pop", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10848,21 +11294,11 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset_offset%1#0" + "idx#0" ] }, - "1666": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%1#0", - "array_head_and_tail%1#0 (copy)", - "array_length%1#0", - "idx#0", - "item_offset_offset%1#0", - "maybe_value%3#0" - ], + "1746": { + "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10871,13 +11307,11 @@ "array_length%1#0", "found#0", "idx#0", - "array_head_and_tail%1#0", - "item_offset_offset%1#0", - "array_head_and_tail%1#0 (copy)" + "found#0" ] }, - "1668": { - "op": "swap", + "1747": { + "op": "frame_bury 5", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10885,20 +11319,23 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "array_head_and_tail%1#0", - "array_head_and_tail%1#0 (copy)", - "item_offset_offset%1#0" + "idx#0" ] }, - "1669": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%1#0", + "1749": { + "block": "remove_label_from_asset_after_if_else@13", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", "array_length%1#0", - "idx#0", - "item_offset%1#0", - "maybe_value%3#0" + "found#0", + "idx#0" + ], + "op": "frame_dig 5", + "defined_out": [ + "found#0" ], "stack_out": [ "maybe_value%3#0", @@ -10908,21 +11345,11 @@ "array_length%1#0", "found#0", "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0" + "found#0" ] }, - "1670": { - "op": "dup2", - "defined_out": [ - "array_head_and_tail%1#0", - "array_head_and_tail%1#0 (copy)", - "array_length%1#0", - "idx#0", - "item_offset%1#0", - "item_offset%1#0 (copy)", - "maybe_value%3#0" - ], + "1751": { + "op": "bnz remove_label_from_asset_after_if_else@16", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10930,22 +11357,14 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "array_head_and_tail%1#0 (copy)", - "item_offset%1#0 (copy)" + "idx#0" ] }, - "1671": { - "op": "extract_uint16", + "1754": { + "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "item_length%1#0", - "item_offset%1#0", - "maybe_value%3#0" + "\"ERR:NOEXIST\"", + "found#0" ], "stack_out": [ "maybe_value%3#0", @@ -10955,13 +11374,11 @@ "array_length%1#0", "found#0", "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "item_length%1#0" + "\"ERR:NOEXIST\"" ] }, - "1672": { - "op": "intc_2 // 2", + "1755": { + "op": "log", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10969,43 +11386,43 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "item_length%1#0", - "2" + "idx#0" ] }, - "1673": { - "op": "+", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "item_head_tail_length%1#0", - "item_offset%1#0", - "maybe_value%3#0" - ], - "stack_out": [ + "1756": { + "op": "err" + }, + "1757": { + "block": "remove_label_from_asset_after_if_else@16", + "stack_in": [ "maybe_value%3#0", "next_list#0", "stored_label#0", "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "item_head_tail_length%1#0" - ] - }, - "1674": { - "op": "extract3", + "idx#0" + ], + "op": "frame_dig -2", "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", "array_length%1#0", + "found#0", "idx#0", - "maybe_value%3#0", - "stored_label#0" + "label#0 (copy)" + ] + }, + "1759": { + "op": "box_get", + "defined_out": [ + "label_descriptor#0", + "maybe_exists%4#0" ], "stack_out": [ "maybe_value%3#0", @@ -11015,11 +11432,13 @@ "array_length%1#0", "found#0", "idx#0", - "stored_label#0" + "label_descriptor#0", + "maybe_exists%4#0" ] }, - "1675": { - "op": "dup", + "1760": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -11028,17 +11447,14 @@ "array_length%1#0", "found#0", "idx#0", - "stored_label#0", - "stored_label#0" + "label_descriptor#0" ] }, - "1676": { - "op": "frame_bury 2", + "1761": { + "op": "dup", "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "stored_label#0" + "label_descriptor#0", + "label_descriptor#0 (copy)" ], "stack_out": [ "maybe_value%3#0", @@ -11048,17 +11464,16 @@ "array_length%1#0", "found#0", "idx#0", - "stored_label#0" + "label_descriptor#0", + "label_descriptor#0 (copy)" ] }, - "1678": { - "op": "extract 2 0", + "1762": { + "op": "intc_2 // 2", "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "stored_label#0", - "tmp%14#0" + "2", + "label_descriptor#0", + "label_descriptor#0 (copy)" ], "stack_out": [ "maybe_value%3#0", @@ -11068,18 +11483,16 @@ "array_length%1#0", "found#0", "idx#0", - "tmp%14#0" + "label_descriptor#0", + "label_descriptor#0 (copy)", + "2" ] }, - "1681": { - "op": "frame_dig -2", + "1763": { + "op": "extract_uint64", "defined_out": [ - "array_length%1#0", - "idx#0", - "label#0 (copy)", - "maybe_value%3#0", - "stored_label#0", - "tmp%14#0" + "label_descriptor#0", + "tmp%20#0" ], "stack_out": [ "maybe_value%3#0", @@ -11089,18 +11502,16 @@ "array_length%1#0", "found#0", "idx#0", - "tmp%14#0", - "label#0 (copy)" + "label_descriptor#0", + "tmp%20#0" ] }, - "1683": { - "op": "!=", + "1764": { + "op": "intc_0 // 1", "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "stored_label#0", - "tmp%15#0" + "1", + "label_descriptor#0", + "tmp%20#0" ], "stack_out": [ "maybe_value%3#0", @@ -11110,11 +11521,17 @@ "array_length%1#0", "found#0", "idx#0", - "tmp%15#0" + "label_descriptor#0", + "tmp%20#0", + "1" ] }, - "1684": { - "op": "bz remove_label_from_asset_else_body@9", + "1765": { + "op": "-", + "defined_out": [ + "label_descriptor#0", + "to_encode%0#0" + ], "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -11122,17 +11539,16 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0" + "idx#0", + "label_descriptor#0", + "to_encode%0#0" ] }, - "1687": { - "op": "frame_dig 1", + "1766": { + "op": "itob", "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "next_list#0", - "stored_label#0" + "label_descriptor#0", + "val_as_bytes%0#0" ], "stack_out": [ "maybe_value%3#0", @@ -11142,11 +11558,12 @@ "array_length%1#0", "found#0", "idx#0", - "next_list#0" + "label_descriptor#0", + "val_as_bytes%0#0" ] }, - "1689": { - "op": "frame_dig 2", + "1767": { + "op": "replace2 2", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -11155,19 +11572,28 @@ "array_length%1#0", "found#0", "idx#0", - "next_list#0", - "stored_label#0" + "label_descriptor#0" ] }, - "1691": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "array_length%1#0", - "idx#0", + "1769": { + "op": "frame_dig -2", + "stack_out": [ "maybe_value%3#0", "next_list#0", - "stored_label#0" + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1771": { + "op": "box_del", + "defined_out": [ + "label_descriptor#0", + "{box_del}" ], "stack_out": [ "maybe_value%3#0", @@ -11177,14 +11603,12 @@ "array_length%1#0", "found#0", "idx#0", - "next_list#0", - "stored_label#0", - "1" + "label_descriptor#0", + "{box_del}" ] }, - "1692": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", + "1772": { + "op": "pop", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -11193,18 +11617,39 @@ "array_length%1#0", "found#0", "idx#0", - "next_list#0" + "label_descriptor#0" ] }, - "1695": { - "op": "frame_bury 1", - "defined_out": [ + "1773": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", "array_length%1#0", + "found#0", "idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1775": { + "op": "swap", + "stack_out": [ "maybe_value%3#0", "next_list#0", - "stored_label#0" - ], + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label#0 (copy)", + "label_descriptor#0" + ] + }, + "1776": { + "op": "box_put", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -11215,8 +11660,12 @@ "idx#0" ] }, - "1697": { - "block": "remove_label_from_asset_after_if_else@10", + "1777": { + "retsub": true, + "op": "retsub" + }, + "1778": { + "block": "remove_label_from_asset_else_body@3", "stack_in": [ "maybe_value%3#0", "next_list#0", @@ -11226,9 +11675,9 @@ "found#0", "idx#0" ], - "op": "frame_dig 6", + "op": "intc_1 // 0", "defined_out": [ - "idx#0" + "found#0" ], "stack_out": [ "maybe_value%3#0", @@ -11238,14 +11687,13 @@ "array_length%1#0", "found#0", "idx#0", - "idx#0" + "found#0" ] }, - "1699": { - "op": "intc_0 // 1", + "1779": { + "op": "frame_bury 5", "defined_out": [ - "1", - "idx#0" + "found#0" ], "stack_out": [ "maybe_value%3#0", @@ -11254,13 +11702,27 @@ "tmp%1#0", "array_length%1#0", "found#0", - "idx#0", - "idx#0", - "1" + "idx#0" ] }, - "1700": { - "op": "+", + "1781": { + "op": "b remove_label_from_asset_after_if_else@13" + }, + "1784": { + "block": "remove_label_from_asset_else_body@5", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "next_list#0" + ], "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -11269,13 +11731,13 @@ "array_length%1#0", "found#0", "idx#0", - "idx#0" + "next_list#0" ] }, - "1701": { - "op": "frame_bury 6", + "1785": { + "op": "frame_bury 1", "defined_out": [ - "idx#0" + "next_list#0" ], "stack_out": [ "maybe_value%3#0", @@ -11287,23 +11749,30 @@ "idx#0" ] }, - "1703": { - "op": "b remove_label_from_asset_for_header@6" - }, - "1706": { - "block": "remove_label_from_asset_else_body@9", - "stack_in": [ + "1787": { + "op": "frame_dig 3", + "defined_out": [ + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ "maybe_value%3#0", "next_list#0", "stored_label#0", "tmp%1#0", "array_length%1#0", "found#0", - "idx#0" - ], - "op": "intc_0 // 1", + "idx#0", + "tmp%1#0" + ] + }, + "1789": { + "op": "box_get", "defined_out": [ - "found#0" + "maybe_exists%3#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" ], "stack_out": [ "maybe_value%3#0", @@ -11313,257 +11782,1835 @@ "array_length%1#0", "found#0", "idx#0", - "found#0" + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "1790": { + "op": "swap", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_exists%3#0", + "maybe_value%3#0" + ] + }, + "1791": { + "op": "dup", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "maybe_value%3#0 (copy)" + ] + }, + "1792": { + "op": "cover 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0", + "maybe_exists%3#0", + "maybe_value%3#0" + ] + }, + "1794": { + "op": "frame_bury 0", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "1796": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0" + ] + }, + "1797": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0", + "0" + ] + }, + "1798": { + "op": "extract_uint16", + "defined_out": [ + "array_length%1#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_length%1#0" + ] + }, + "1799": { + "op": "frame_bury 4", + "defined_out": [ + "array_length%1#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1801": { + "op": "intc_1 // 0", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "1802": { + "op": "frame_bury 6", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1804": { + "block": "remove_label_from_asset_for_header@6", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig 6", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "1806": { + "op": "frame_dig 4", + "defined_out": [ + "array_length%1#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0", + "array_length%1#0" + ] + }, + "1808": { + "op": "<", + "defined_out": [ + "array_length%1#0", + "continue_looping%0#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "continue_looping%0#0" + ] + }, + "1809": { + "op": "bz remove_label_from_asset_after_for@12", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1812": { + "op": "frame_dig 0", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0" + ] + }, + "1814": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0" + ] + }, + "1817": { + "op": "frame_dig 6", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "idx#0" + ] + }, + "1819": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "idx#0", + "2" + ] + }, + "1820": { + "op": "*", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_offset_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset_offset%1#0" + ] + }, + "1821": { + "op": "dig 1", + "defined_out": [ + "array_head_and_tail%1#0", + "array_head_and_tail%1#0 (copy)", + "array_length%1#0", + "idx#0", + "item_offset_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset_offset%1#0", + "array_head_and_tail%1#0 (copy)" + ] + }, + "1823": { + "op": "swap", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "array_head_and_tail%1#0 (copy)", + "item_offset_offset%1#0" + ] + }, + "1824": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0" + ] + }, + "1825": { + "op": "dup2", + "defined_out": [ + "array_head_and_tail%1#0", + "array_head_and_tail%1#0 (copy)", + "array_length%1#0", + "idx#0", + "item_offset%1#0", + "item_offset%1#0 (copy)", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "array_head_and_tail%1#0 (copy)", + "item_offset%1#0 (copy)" + ] + }, + "1826": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_length%1#0", + "item_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "item_length%1#0" + ] + }, + "1827": { + "op": "intc_2 // 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "item_length%1#0", + "2" + ] + }, + "1828": { + "op": "+", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_head_tail_length%1#0", + "item_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "item_head_tail_length%1#0" + ] + }, + "1829": { + "op": "extract3", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "stored_label#0" + ] + }, + "1830": { + "op": "dup", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "stored_label#0", + "stored_label#0" + ] + }, + "1831": { + "op": "frame_bury 2", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "stored_label#0" + ] + }, + "1833": { + "op": "extract 2 0", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0", + "tmp%14#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%14#0" + ] + }, + "1836": { + "op": "frame_dig -2", + "defined_out": [ + "array_length%1#0", + "idx#0", + "label#0 (copy)", + "maybe_value%3#0", + "stored_label#0", + "tmp%14#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%14#0", + "label#0 (copy)" + ] + }, + "1838": { + "op": "!=", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0", + "tmp%15#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%15#0" + ] + }, + "1839": { + "op": "bz remove_label_from_asset_else_body@9", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1842": { + "op": "frame_dig 1", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0" + ] + }, + "1844": { + "op": "frame_dig 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0", + "stored_label#0" + ] + }, + "1846": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0", + "stored_label#0", + "1" + ] + }, + "1847": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0" + ] + }, + "1850": { + "op": "frame_bury 1", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1852": { + "block": "remove_label_from_asset_after_if_else@10", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig 6", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "1854": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0", + "1" + ] + }, + "1855": { + "op": "+", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "1856": { + "op": "frame_bury 6", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1858": { + "op": "b remove_label_from_asset_for_header@6" + }, + "1861": { + "block": "remove_label_from_asset_else_body@9", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "intc_0 // 1", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "found#0" + ] + }, + "1862": { + "op": "frame_bury 5", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1864": { + "op": "b remove_label_from_asset_after_if_else@10" + }, + "1867": { + "block": "remove_label_from_asset_after_for@12", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "1869": { + "op": "dup", + "defined_out": [ + "tmp%1#0", + "tmp%1#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ] + }, + "1870": { + "op": "box_del", + "defined_out": [ + "tmp%1#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0", + "{box_del}" + ] + }, + "1871": { + "op": "pop", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "1872": { + "op": "frame_dig 1", + "defined_out": [ + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0", + "next_list#0" + ] + }, + "1874": { + "op": "box_put", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1875": { + "op": "b remove_label_from_asset_after_if_else@13" + }, + "1878": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "1881": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "1883": { + "op": "itob", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "1884": { + "op": "dup", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0" + ] + }, + "1885": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1886": { + "op": "bury 1", + "stack_out": [ + "tmp%0#0", + "maybe_exists%0#0" + ] + }, + "1888": { + "op": "bz get_asset_labels_after_if_else@2", + "stack_out": [ + "tmp%0#0" + ] + }, + "1891": { + "op": "frame_dig 0", + "stack_out": [ + "tmp%0#0", + "tmp%0#0" + ] + }, + "1893": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1894": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "tmp%0#0", + "maybe_value%1#0" + ] + }, + "1895": { + "op": "swap" + }, + "1896": { + "retsub": true, + "op": "retsub" + }, + "1897": { + "block": "get_asset_labels_after_if_else@2", + "stack_in": [ + "tmp%0#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "0x0000" + ], + "stack_out": [ + "tmp%0#0", + "0x0000" + ] + }, + "1898": { + "op": "swap" + }, + "1899": { + "retsub": true, + "op": "retsub" + }, + "1900": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "1903": { + "op": "intc_1 // 0", + "stack_out": [ + "tmp%0#0" + ] + }, + "1904": { + "op": "bytec_2 // 0x0000" + }, + "1905": { + "op": "frame_dig -1" + }, + "1907": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "assets#0 (copy)", + "0" + ] + }, + "1908": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0" + ] + }, + "1909": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "1910": { + "block": "get_assets_labels_for_header@1", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "1912": { + "op": "frame_dig 2", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "1914": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "1915": { + "op": "bz get_assets_labels_after_for@7", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "1918": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "1920": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "1923": { + "op": "frame_dig 3", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "1925": { + "op": "pushint 8 // 8", + "defined_out": [ + "8", + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0", + "8" + ] + }, + "1927": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "1928": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "asset#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "asset#0" + ] + }, + "1929": { + "op": "itob", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0" + ] + }, + "1930": { + "op": "dup", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0", + "tmp%0#0" + ] + }, + "1931": { + "op": "frame_bury 0", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0" + ] + }, + "1933": { + "op": "box_len", + "defined_out": [ + "_i#0", + "array_length%0#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1934": { + "op": "bury 1", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_exists%0#0" + ] + }, + "1936": { + "op": "bz get_assets_labels_else_body@4", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "1939": { + "op": "frame_dig 0", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0" + ] + }, + "1941": { + "op": "box_get", + "defined_out": [ + "_i#0", + "array_length%0#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1942": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%1#0" + ] + }, + "1943": { + "op": "bytec 6 // 0x0002", + "defined_out": [ + "0x0002", + "_i#0", + "array_length%0#0", + "maybe_value%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%1#0", + "0x0002" + ] + }, + "1945": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "0x0002", + "maybe_value%1#0" + ] + }, + "1946": { + "op": "concat", + "defined_out": [ + "_i#0", + "array_length%0#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0" + ] + }, + "1947": { + "op": "frame_dig 1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "out#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0" + ] + }, + "1949": { + "op": "dup", + "defined_out": [ + "_i#0", + "array_length%0#0", + "out#0", + "out#0 (copy)", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0", + "out#0 (copy)" + ] + }, + "1950": { + "op": "intc_1 // 0", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0", + "out#0 (copy)", + "0" + ] + }, + "1951": { + "op": "extract_uint16", + "defined_out": [ + "_i#0", + "array_length%0#0", + "l_count%0#0", + "out#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0", + "l_count%0#0" + ] + }, + "1952": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "l_count%0#0", + "out#0" ] }, - "1707": { - "op": "frame_bury 5", + "1953": { + "op": "extract 2 0", "defined_out": [ - "found#0" + "_i#0", + "array_length%0#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "out#0", + "result%1#0", + "tmp%0#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "l_count%0#0", + "l_head_and_tail%0#0" ] }, - "1709": { - "op": "b remove_label_from_asset_after_if_else@10" - }, - "1712": { - "block": "remove_label_from_asset_after_for@12", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig 3", + "1956": { + "op": "intc_0 // 1", "defined_out": [ - "tmp%1#0" + "1", + "_i#0", + "array_length%0#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "out#0", + "result%1#0", + "tmp%0#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "1" ] }, - "1714": { - "op": "dup", - "defined_out": [ - "tmp%1#0", - "tmp%1#0 (copy)" - ], + "1957": { + "op": "uncover 3", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0", - "tmp%1#0 (copy)" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "1", + "result%1#0" ] }, - "1715": { - "op": "box_del", + "1959": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", + "op": "callsub dynamic_array_concat_dynamic_element", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0" + ] + }, + "1962": { + "op": "frame_bury 1", "defined_out": [ - "tmp%1#0", - "{box_del}" + "_i#0", + "array_length%0#0", + "out#0", + "tmp%0#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0", - "{box_del}" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" ] }, - "1716": { - "op": "pop", + "1964": { + "block": "get_assets_labels_after_if_else@5", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "_i#0" + ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0" ] }, - "1717": { - "op": "frame_dig 1", + "1966": { + "op": "intc_0 // 1", "defined_out": [ - "next_list#0", - "tmp%1#0" + "1", + "_i#0" ], "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0", - "next_list#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0", + "1" ] }, - "1719": { - "op": "box_put", + "1967": { + "op": "+", "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0" ] }, - "1720": { - "op": "b remove_label_from_asset_after_if_else@13" - }, - "1723": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", - "params": { - "asset#0": "uint64" - }, - "block": "get_asset_labels", - "stack_in": [], - "op": "proto 1 1" - }, - "1726": { - "op": "frame_dig -1", + "1968": { + "op": "frame_bury 3", "defined_out": [ - "asset#0 (copy)" + "_i#0" ], "stack_out": [ - "asset#0 (copy)" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" ] }, - "1728": { - "op": "itob", + "1970": { + "op": "b get_assets_labels_for_header@1" + }, + "1973": { + "block": "get_assets_labels_else_body@4", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", "defined_out": [ - "tmp%0#0" + "out#0" ], "stack_out": [ - "tmp%0#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0" ] }, - "1729": { + "1975": { "op": "dup", "defined_out": [ - "tmp%0#0" + "out#0", + "out#0 (copy)" ], "stack_out": [ "tmp%0#0", - "tmp%0#0" + "out#0", + "array_length%0#0", + "_i#0", + "out#0", + "out#0 (copy)" ] }, - "1730": { - "op": "box_len", + "1976": { + "op": "intc_1 // 0", "defined_out": [ - "cond#0", - "maybe_value%0#0", - "tmp%0#0" + "0", + "out#0", + "out#0 (copy)" ], "stack_out": [ "tmp%0#0", - "maybe_value%0#0", - "cond#0" + "out#0", + "array_length%0#0", + "_i#0", + "out#0", + "out#0 (copy)", + "0" ] }, - "1731": { - "op": "bury 1", + "1977": { + "op": "extract_uint16", + "defined_out": [ + "l_count%1#0", + "out#0" + ], "stack_out": [ "tmp%0#0", - "cond#0" + "out#0", + "array_length%0#0", + "_i#0", + "out#0", + "l_count%1#0" ] }, - "1733": { - "op": "bnz get_asset_labels_after_if_else@3", + "1978": { + "op": "swap", "stack_out": [ - "tmp%0#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "out#0" ] }, - "1736": { - "op": "bytec_0 // \"ERR:NOEXIST\"", + "1979": { + "op": "extract 2 0", "defined_out": [ - "\"ERR:NOEXIST\"", - "tmp%0#0" + "l_count%1#0", + "l_head_and_tail%1#0", + "out#0" ], "stack_out": [ "tmp%0#0", - "\"ERR:NOEXIST\"" + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "l_head_and_tail%1#0" ] }, - "1737": { - "op": "log", + "1982": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "l_count%1#0", + "l_head_and_tail%1#0", + "out#0" + ], "stack_out": [ - "tmp%0#0" + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "l_head_and_tail%1#0", + "1" ] }, - "1738": { - "op": "err" - }, - "1739": { - "block": "get_asset_labels_after_if_else@3", - "stack_in": [ - "tmp%0#0" - ], - "op": "frame_dig 0", + "1983": { + "op": "pushbytes 0x00020000", "defined_out": [ - "tmp%0#0" + "0x00020000", + "1", + "l_count%1#0", + "l_head_and_tail%1#0", + "out#0" ], "stack_out": [ "tmp%0#0", - "tmp%0#0" + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "l_head_and_tail%1#0", + "1", + "0x00020000" ] }, - "1741": { - "op": "box_get", + "1989": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", + "op": "callsub dynamic_array_concat_dynamic_element", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0" + ] + }, + "1992": { + "op": "frame_bury 1", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%0#0" + "out#0" ], "stack_out": [ "tmp%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" + "out#0", + "array_length%0#0", + "_i#0" ] }, - "1742": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", + "1994": { + "op": "b get_assets_labels_after_if_else@5" + }, + "1997": { + "block": "get_assets_labels_after_for@7", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "out#0" + ], "stack_out": [ "tmp%0#0", - "maybe_value%1#0" + "out#0", + "array_length%0#0", + "_i#0", + "out#0" ] }, - "1743": { - "op": "swap" + "1999": { + "op": "frame_bury 0" }, - "1744": { + "2001": { "retsub": true, "op": "retsub" } diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal index 739e335..251bad6 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal @@ -4,47 +4,68 @@ // smart_contracts.asset_labeling.contract.AssetLabeling.__algopy_entrypoint_with_init() -> uint64: main: intcblock 1 0 2 4294967295 4294967296 - bytecblock "ERR:NOEXIST" "admin" "" 0x151f7c75 "ERR:EXISTS" "ERR:UNAUTH" "ERR:LENGTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0002 0x0001 0x0000 + bytecblock "ERR:NOEXIST" "" 0x0000 "admin" 0x151f7c75 "ERR:EXISTS" 0x0002 "ERR:UNAUTH" "ERR:LENGTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0001 txn ApplicationID bnz main_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:40 + // smart_contracts/asset_labeling/contract.py:45 // self.admin = Txn.sender - bytec_1 // "admin" + bytec_3 // "admin" txn Sender app_global_put main_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txn NumAppArgs - bz main_bare_routing@16 - pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]" + bz main_bare_routing@17 + pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]" txna ApplicationArgs 0 - match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 + match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 -main_after_if_else@18: - // smart_contracts/asset_labeling/contract.py:38 +main_after_if_else@19: + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): intc_1 // 0 return +main_get_assets_labels_route@16: + // smart_contracts/asset_labeling/contract.py:269 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:43 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:269 + // @abimethod(readonly=True) + callsub get_assets_labels + bytec 4 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + main_get_asset_labels_route@15: - // smart_contracts/asset_labeling/contract.py:254 + // smart_contracts/asset_labeling/contract.py:262 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:254 + // smart_contracts/asset_labeling/contract.py:262 // @abimethod(readonly=True) callsub get_asset_labels - bytec_3 // 0x151f7c75 + bytec 4 // 0x151f7c75 swap concat log @@ -52,64 +73,64 @@ main_get_asset_labels_route@15: return main_remove_label_from_asset_route@14: - // smart_contracts/asset_labeling/contract.py:220 + // smart_contracts/asset_labeling/contract.py:228 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:220 + // smart_contracts/asset_labeling/contract.py:228 // @abimethod() callsub remove_label_from_asset intc_0 // 1 return main_add_label_to_asset_route@13: - // smart_contracts/asset_labeling/contract.py:192 + // smart_contracts/asset_labeling/contract.py:200 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:192 + // smart_contracts/asset_labeling/contract.py:200 // @abimethod() callsub add_label_to_asset intc_0 // 1 return main_get_operator_labels_route@12: - // smart_contracts/asset_labeling/contract.py:178 + // smart_contracts/asset_labeling/contract.py:184 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts - // smart_contracts/asset_labeling/contract.py:178 + // smart_contracts/asset_labeling/contract.py:184 // @abimethod(readonly=True) callsub get_operator_labels - bytec_3 // 0x151f7c75 + bytec 4 // 0x151f7c75 swap concat log @@ -117,80 +138,80 @@ main_get_operator_labels_route@12: return main_remove_operator_from_label_route@11: - // smart_contracts/asset_labeling/contract.py:137 + // smart_contracts/asset_labeling/contract.py:143 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:137 + // smart_contracts/asset_labeling/contract.py:143 // @abimethod() callsub remove_operator_from_label intc_0 // 1 return main_add_operator_to_label_route@10: - // smart_contracts/asset_labeling/contract.py:109 + // smart_contracts/asset_labeling/contract.py:115 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:109 + // smart_contracts/asset_labeling/contract.py:115 // @abimethod() callsub add_operator_to_label intc_0 // 1 return main_log_labels_route@9: - // smart_contracts/asset_labeling/contract.py:78 + // smart_contracts/asset_labeling/contract.py:84 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:78 + // smart_contracts/asset_labeling/contract.py:84 // @abimethod(readonly=True) callsub log_labels intc_0 // 1 return main_get_label_route@8: - // smart_contracts/asset_labeling/contract.py:73 + // smart_contracts/asset_labeling/contract.py:79 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 - // smart_contracts/asset_labeling/contract.py:73 + // smart_contracts/asset_labeling/contract.py:79 // @abimethod(readonly=True) callsub get_label - bytec_3 // 0x151f7c75 + bytec 4 // 0x151f7c75 swap concat log @@ -198,67 +219,67 @@ main_get_label_route@8: return main_remove_label_route@7: - // smart_contracts/asset_labeling/contract.py:65 + // smart_contracts/asset_labeling/contract.py:71 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 - // smart_contracts/asset_labeling/contract.py:65 + // smart_contracts/asset_labeling/contract.py:71 // @abimethod() callsub remove_label intc_0 // 1 return main_add_label_route@6: - // smart_contracts/asset_labeling/contract.py:54 + // smart_contracts/asset_labeling/contract.py:60 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:54 + // smart_contracts/asset_labeling/contract.py:60 // @abimethod() callsub add_label intc_0 // 1 return main_change_admin_route@5: - // smart_contracts/asset_labeling/contract.py:49 + // smart_contracts/asset_labeling/contract.py:55 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts - // smart_contracts/asset_labeling/contract.py:49 + // smart_contracts/asset_labeling/contract.py:55 // @abimethod() callsub change_admin intc_0 // 1 return -main_bare_routing@16: - // smart_contracts/asset_labeling/contract.py:38 +main_bare_routing@17: + // smart_contracts/asset_labeling/contract.py:43 // class AssetLabeling(ARC4Contract): txn OnCompletion - bnz main_after_if_else@18 + bnz main_after_if_else@19 txn ApplicationID ! assert // can only call when creating @@ -345,22 +366,112 @@ dynamic_array_concat_byte_length_head_after_for@5: retsub +// _puya_lib.arc4.dynamic_array_concat_dynamic_element(array_items_count: uint64, array_head_and_tail: bytes, new_items_count: uint64, new_head_and_tail: bytes) -> bytes: +dynamic_array_concat_dynamic_element: + proto 4 1 + bytec_1 // "" + dup + frame_dig -2 + intc_2 // 2 + * + frame_dig -4 + intc_2 // 2 + * + intc_1 // 0 + +dynamic_array_concat_dynamic_element_for_header@1: + frame_dig 4 + frame_dig 3 + < + bz dynamic_array_concat_dynamic_element_after_for@4 + frame_dig -3 + frame_dig 4 + dup + cover 2 + extract_uint16 + frame_dig 2 + + + itob + extract 6 2 + frame_dig 1 + swap + concat + frame_bury 1 + intc_2 // 2 + + + frame_bury 4 + b dynamic_array_concat_dynamic_element_for_header@1 + +dynamic_array_concat_dynamic_element_after_for@4: + frame_dig -3 + len + frame_bury 0 + intc_1 // 0 + frame_bury 4 + +dynamic_array_concat_dynamic_element_for_header@5: + frame_dig 4 + frame_dig 2 + < + bz dynamic_array_concat_dynamic_element_after_for@8 + frame_dig -1 + frame_dig 4 + dup + cover 2 + extract_uint16 + frame_dig 0 + + + itob + extract 6 2 + frame_dig 1 + swap + concat + frame_bury 1 + intc_2 // 2 + + + frame_bury 4 + b dynamic_array_concat_dynamic_element_for_header@5 + +dynamic_array_concat_dynamic_element_after_for@8: + frame_dig -4 + frame_dig -2 + + + itob + extract 6 2 + frame_dig 1 + concat + frame_dig -3 + frame_dig 3 + frame_dig 0 + substring3 + concat + frame_dig -1 + len + frame_dig -1 + frame_dig 2 + uncover 2 + substring3 + concat + frame_bury 0 + retsub + + // smart_contracts.asset_labeling.contract.AssetLabeling.admin_only() -> void: admin_only: - // smart_contracts/asset_labeling/contract.py:47 + // smart_contracts/asset_labeling/contract.py:53 // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) txn Sender intc_1 // 0 - bytec_1 // "admin" + bytec_3 // "admin" app_global_get_ex assert // check self.admin exists == // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz admin_only_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:47 + // smart_contracts/asset_labeling/contract.py:53 // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) - bytec 5 // "ERR:UNAUTH" + bytec 7 // "ERR:UNAUTH" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -374,16 +485,16 @@ admin_only_after_if_else@3: // smart_contracts.asset_labeling.contract.AssetLabeling.change_admin(new_admin: bytes) -> void: change_admin: - // smart_contracts/asset_labeling/contract.py:49-50 + // smart_contracts/asset_labeling/contract.py:55-56 // @abimethod() // def change_admin(self, new_admin: Account) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:57 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:52 + // smart_contracts/asset_labeling/contract.py:58 // self.admin = new_admin - bytec_1 // "admin" + bytec_3 // "admin" frame_dig -1 app_global_put retsub @@ -391,14 +502,14 @@ change_admin: // smart_contracts.asset_labeling.contract.AssetLabeling.add_label(id: bytes, name: bytes) -> void: add_label: - // smart_contracts/asset_labeling/contract.py:54-55 + // smart_contracts/asset_labeling/contract.py:60-61 // @abimethod() // def add_label(self, id: String, name: String) -> None: proto 2 0 - // smart_contracts/asset_labeling/contract.py:56 + // smart_contracts/asset_labeling/contract.py:62 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:57 + // smart_contracts/asset_labeling/contract.py:63 // ensure(id not in self.labels, S("ERR:EXISTS")) frame_dig -2 box_len @@ -406,9 +517,9 @@ add_label: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bz add_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:57 + // smart_contracts/asset_labeling/contract.py:63 // ensure(id not in self.labels, S("ERR:EXISTS")) - bytec 4 // "ERR:EXISTS" + bytec 5 // "ERR:EXISTS" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -417,7 +528,7 @@ add_label: err add_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:58 + // smart_contracts/asset_labeling/contract.py:64 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) frame_dig -2 len @@ -426,9 +537,9 @@ add_label_after_if_else@3: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:58 + // smart_contracts/asset_labeling/contract.py:64 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - bytec 6 // "ERR:LENGTH" + bytec 8 // "ERR:LENGTH" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -437,7 +548,7 @@ add_label_after_if_else@3: err add_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:60 + // smart_contracts/asset_labeling/contract.py:66 // arc4.String(name), frame_dig -1 len @@ -445,7 +556,7 @@ add_label_after_if_else@7: extract 6 2 frame_dig -1 concat - // smart_contracts/asset_labeling/contract.py:59-63 + // smart_contracts/asset_labeling/contract.py:65-69 // self.labels[id] = LabelDescriptor( // arc4.String(name), // arc4.UInt64(0), @@ -465,14 +576,14 @@ add_label_after_if_else@7: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_label(id: bytes) -> void: remove_label: - // smart_contracts/asset_labeling/contract.py:65-66 + // smart_contracts/asset_labeling/contract.py:71-72 // @abimethod() // def remove_label(self, id: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:67 + // smart_contracts/asset_labeling/contract.py:73 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:68 + // smart_contracts/asset_labeling/contract.py:74 // ensure(id in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len @@ -480,7 +591,7 @@ remove_label: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:68 + // smart_contracts/asset_labeling/contract.py:74 // ensure(id in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -491,7 +602,7 @@ remove_label: err remove_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:69 + // smart_contracts/asset_labeling/contract.py:75 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) frame_dig -1 len @@ -500,9 +611,9 @@ remove_label_after_if_else@3: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:69 + // smart_contracts/asset_labeling/contract.py:75 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - bytec 6 // "ERR:LENGTH" + bytec 8 // "ERR:LENGTH" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -511,20 +622,20 @@ remove_label_after_if_else@3: err remove_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:70 + // smart_contracts/asset_labeling/contract.py:76 // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) frame_dig -1 box_get assert // check self.labels entry exists extract 2 8 // on error: Index access is out of bounds - bytec 7 // 0x0000000000000000 + bytec 9 // 0x0000000000000000 b== // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_label_after_if_else@11 - // smart_contracts/asset_labeling/contract.py:70 + // smart_contracts/asset_labeling/contract.py:76 // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) - bytec 8 // "ERR:NOEMPTY" + bytec 10 // "ERR:NOEMPTY" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -533,7 +644,7 @@ remove_label_after_if_else@7: err remove_label_after_if_else@11: - // smart_contracts/asset_labeling/contract.py:71 + // smart_contracts/asset_labeling/contract.py:77 // del self.labels[id] frame_dig -1 box_del @@ -543,11 +654,11 @@ remove_label_after_if_else@11: // smart_contracts.asset_labeling.contract.AssetLabeling.get_label(id: bytes) -> bytes: get_label: - // smart_contracts/asset_labeling/contract.py:73-74 + // smart_contracts/asset_labeling/contract.py:79-80 // @abimethod(readonly=True) // def get_label(self, id: String) -> LabelDescriptor: proto 1 1 - // smart_contracts/asset_labeling/contract.py:75 + // smart_contracts/asset_labeling/contract.py:81 // ensure(id in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len @@ -555,7 +666,7 @@ get_label: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz get_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:75 + // smart_contracts/asset_labeling/contract.py:81 // ensure(id in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -566,7 +677,7 @@ get_label: err get_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:76 + // smart_contracts/asset_labeling/contract.py:82 // return self.labels[id] frame_dig -1 box_get @@ -576,11 +687,11 @@ get_label_after_if_else@3: // smart_contracts.asset_labeling.contract.AssetLabeling.log_labels(ids: bytes) -> void: log_labels: - // smart_contracts/asset_labeling/contract.py:78-79 + // smart_contracts/asset_labeling/contract.py:84-85 // @abimethod(readonly=True) // def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:80 + // smart_contracts/asset_labeling/contract.py:86 // for _idx, label_id in uenumerate(ids): frame_dig -1 intc_1 // 0 @@ -588,7 +699,7 @@ log_labels: intc_1 // 0 log_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:80 + // smart_contracts/asset_labeling/contract.py:86 // for _idx, label_id in uenumerate(ids): frame_dig 1 frame_dig 0 @@ -609,7 +720,7 @@ log_labels_for_header@1: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:81 + // smart_contracts/asset_labeling/contract.py:87 // log(self.labels[label_id.native]) extract 2 0 box_get @@ -626,25 +737,25 @@ log_labels_after_for@4: // smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only(label: bytes) -> void: admin_or_operator_only: - // smart_contracts/asset_labeling/contract.py:85-86 + // smart_contracts/asset_labeling/contract.py:91-92 // @subroutine // def admin_or_operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:87 + // smart_contracts/asset_labeling/contract.py:93 // if Txn.sender == self.admin: txn Sender intc_1 // 0 - bytec_1 // "admin" + bytec_3 // "admin" app_global_get_ex assert // check self.admin exists == bz admin_or_operator_only_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:88 + // smart_contracts/asset_labeling/contract.py:94 // return retsub admin_or_operator_only_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:89 + // smart_contracts/asset_labeling/contract.py:95 // self.operator_only(label) frame_dig -1 callsub operator_only @@ -653,35 +764,35 @@ admin_or_operator_only_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.operator_only(label: bytes) -> void: operator_only: - // smart_contracts/asset_labeling/contract.py:91-92 + // smart_contracts/asset_labeling/contract.py:97-98 // @subroutine // def operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:94 + // smart_contracts/asset_labeling/contract.py:100 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) txn Sender frame_dig -1 callsub get_operator_label_index intc 4 // 4294967296 != - // smart_contracts/asset_labeling/contract.py:94-96 + // smart_contracts/asset_labeling/contract.py:100-102 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), bz operator_only_bool_false@3 - // smart_contracts/asset_labeling/contract.py:95 + // smart_contracts/asset_labeling/contract.py:101 // and self.get_operator_label_index(Txn.sender, label) txn Sender frame_dig -1 callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:96 + // smart_contracts/asset_labeling/contract.py:102 // != UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:95-96 + // smart_contracts/asset_labeling/contract.py:101-102 // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), != - // smart_contracts/asset_labeling/contract.py:94-96 + // smart_contracts/asset_labeling/contract.py:100-102 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), @@ -692,9 +803,9 @@ operator_only_bool_merge@4: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz operator_only_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:97 + // smart_contracts/asset_labeling/contract.py:103 // S("ERR:UNAUTH"), - bytec 5 // "ERR:UNAUTH" + bytec 7 // "ERR:UNAUTH" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -712,27 +823,27 @@ operator_only_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index(operator: bytes, label: bytes) -> uint64: get_operator_label_index: - // smart_contracts/asset_labeling/contract.py:100-101 + // smart_contracts/asset_labeling/contract.py:106-107 // @subroutine // def get_operator_label_index(self, operator: Account, label: String) -> UInt64: proto 2 1 intc_1 // 0 - bytec_2 // "" + bytec_1 // "" dup - // smart_contracts/asset_labeling/contract.py:102 + // smart_contracts/asset_labeling/contract.py:108 // if operator not in self.operators: frame_dig -2 box_len bury 1 bnz get_operator_label_index_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:103 + // smart_contracts/asset_labeling/contract.py:109 // return UInt64(NOT_FOUND_KEY) intc 4 // 4294967296 frame_bury 0 retsub get_operator_label_index_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:104 + // smart_contracts/asset_labeling/contract.py:110 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig -2 box_get @@ -748,7 +859,7 @@ get_operator_label_index_after_if_else@2: frame_bury 2 get_operator_label_index_for_header@3: - // smart_contracts/asset_labeling/contract.py:104 + // smart_contracts/asset_labeling/contract.py:110 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig 2 frame_dig 1 @@ -767,13 +878,13 @@ get_operator_label_index_for_header@3: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:105 + // smart_contracts/asset_labeling/contract.py:111 // if stored_label == label: extract 2 0 frame_dig -1 == bz get_operator_label_index_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:106 + // smart_contracts/asset_labeling/contract.py:112 // return idx frame_dig 2 frame_bury 0 @@ -787,7 +898,7 @@ get_operator_label_index_after_if_else@6: b get_operator_label_index_for_header@3 get_operator_label_index_after_for@8: - // smart_contracts/asset_labeling/contract.py:107 + // smart_contracts/asset_labeling/contract.py:113 // return UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 frame_bury 0 @@ -796,15 +907,15 @@ get_operator_label_index_after_for@8: // smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label(operator: bytes, label: bytes) -> void: add_operator_to_label: - // smart_contracts/asset_labeling/contract.py:109-110 + // smart_contracts/asset_labeling/contract.py:115-116 // @abimethod() // def add_operator_to_label(self, operator: Account, label: String) -> None: proto 2 0 - // smart_contracts/asset_labeling/contract.py:111 + // smart_contracts/asset_labeling/contract.py:117 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:112 + // smart_contracts/asset_labeling/contract.py:118 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len @@ -812,7 +923,7 @@ add_operator_to_label: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_operator_to_label_after_if_else@10 - // smart_contracts/asset_labeling/contract.py:112 + // smart_contracts/asset_labeling/contract.py:118 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -823,31 +934,31 @@ add_operator_to_label: err add_operator_to_label_after_if_else@10: - // smart_contracts/asset_labeling/contract.py:113-114 + // smart_contracts/asset_labeling/contract.py:119-120 // # check if operator exists already // if operator in self.operators: frame_dig -2 box_len bury 1 bz add_operator_to_label_else_body@2 - // smart_contracts/asset_labeling/contract.py:117 + // smart_contracts/asset_labeling/contract.py:123 // self.get_operator_label_index(operator, label) frame_dig -2 frame_dig -1 callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:118 + // smart_contracts/asset_labeling/contract.py:124 // == UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:117-118 + // smart_contracts/asset_labeling/contract.py:123-124 // self.get_operator_label_index(operator, label) // == UInt64(NOT_FOUND_VALUE), == // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_operator_to_label_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:119 + // smart_contracts/asset_labeling/contract.py:125 // S("ERR:EXISTS"), - bytec 4 // "ERR:EXISTS" + bytec 5 // "ERR:EXISTS" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -856,13 +967,13 @@ add_operator_to_label_after_if_else@10: err add_operator_to_label_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:122-123 + // smart_contracts/asset_labeling/contract.py:128-129 // # add label to operator // existing = self.operators[operator].copy() frame_dig -2 box_get assert // check self.operators entry exists - // smart_contracts/asset_labeling/contract.py:124 + // smart_contracts/asset_labeling/contract.py:130 // existing.append(arc4.String(label)) frame_dig -1 len @@ -872,7 +983,7 @@ add_operator_to_label_after_if_else@6: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:125 + // smart_contracts/asset_labeling/contract.py:131 // self.operators[operator] = existing.copy() frame_dig -2 box_del @@ -882,26 +993,26 @@ add_operator_to_label_after_if_else@6: box_put add_operator_to_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:130-131 + // smart_contracts/asset_labeling/contract.py:136-137 // # increment label operators // label_descriptor = self.labels[label].copy() frame_dig -1 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:133 + // smart_contracts/asset_labeling/contract.py:139 // label_descriptor.num_operators.native + UInt64(1) dup pushint 10 // 10 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:132-134 + // smart_contracts/asset_labeling/contract.py:138-140 // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native + UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:135 + // smart_contracts/asset_labeling/contract.py:141 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -912,7 +1023,7 @@ add_operator_to_label_after_if_else@3: retsub add_operator_to_label_else_body@2: - // smart_contracts/asset_labeling/contract.py:127-128 + // smart_contracts/asset_labeling/contract.py:133-134 // # new operator, create new box // self.operators[operator] = arc4.DynamicArray(arc4.String(label)) frame_dig -1 @@ -921,10 +1032,10 @@ add_operator_to_label_else_body@2: extract 6 2 frame_dig -1 concat - bytec 9 // 0x0002 + bytec 6 // 0x0002 swap concat - bytec 10 // 0x0001 + bytec 11 // 0x0001 swap concat frame_dig -2 @@ -938,19 +1049,19 @@ add_operator_to_label_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label(operator: bytes, label: bytes) -> void: remove_operator_from_label: - // smart_contracts/asset_labeling/contract.py:137-138 + // smart_contracts/asset_labeling/contract.py:143-144 // @abimethod() // def remove_operator_from_label(self, operator: Account, label: String) -> None: proto 2 0 intc_1 // 0 dupn 4 - bytec_2 // "" + bytec_1 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:139 + // smart_contracts/asset_labeling/contract.py:145 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:141 + // smart_contracts/asset_labeling/contract.py:147 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len @@ -958,7 +1069,7 @@ remove_operator_from_label: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@28 - // smart_contracts/asset_labeling/contract.py:141 + // smart_contracts/asset_labeling/contract.py:147 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -969,7 +1080,7 @@ remove_operator_from_label: err remove_operator_from_label_after_if_else@28: - // smart_contracts/asset_labeling/contract.py:142 + // smart_contracts/asset_labeling/contract.py:148 // ensure(operator in self.operators, S("ERR:NOEXIST")) frame_dig -2 box_len @@ -977,7 +1088,7 @@ remove_operator_from_label_after_if_else@28: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@32 - // smart_contracts/asset_labeling/contract.py:142 + // smart_contracts/asset_labeling/contract.py:148 // ensure(operator in self.operators, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -988,7 +1099,7 @@ remove_operator_from_label_after_if_else@28: err remove_operator_from_label_after_if_else@32: - // smart_contracts/asset_labeling/contract.py:144-145 + // smart_contracts/asset_labeling/contract.py:150-151 // # ensure label exists in operator // label_idx = self.get_operator_label_index(operator, label) frame_dig -2 @@ -996,27 +1107,27 @@ remove_operator_from_label_after_if_else@32: callsub get_operator_label_index dup frame_bury 7 - // smart_contracts/asset_labeling/contract.py:147 + // smart_contracts/asset_labeling/contract.py:153 // label_idx != UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 != - // smart_contracts/asset_labeling/contract.py:147-149 + // smart_contracts/asset_labeling/contract.py:153-155 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above bz remove_operator_from_label_bool_false@3 - // smart_contracts/asset_labeling/contract.py:148-149 + // smart_contracts/asset_labeling/contract.py:154-155 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above frame_dig 7 - // smart_contracts/asset_labeling/contract.py:149 + // smart_contracts/asset_labeling/contract.py:155 // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above intc 4 // 4294967296 - // smart_contracts/asset_labeling/contract.py:148-149 + // smart_contracts/asset_labeling/contract.py:154-155 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above != - // smart_contracts/asset_labeling/contract.py:147-149 + // smart_contracts/asset_labeling/contract.py:153-155 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above @@ -1027,7 +1138,7 @@ remove_operator_from_label_bool_merge@4: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@24 - // smart_contracts/asset_labeling/contract.py:150 + // smart_contracts/asset_labeling/contract.py:156 // S("ERR:NOEXIST"), bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1038,7 +1149,7 @@ remove_operator_from_label_bool_merge@4: err remove_operator_from_label_after_if_else@24: - // smart_contracts/asset_labeling/contract.py:153-154 + // smart_contracts/asset_labeling/contract.py:159-160 // # ensure only empty labels can be left operator-less // label_descriptor = self.labels[label].copy() frame_dig -1 @@ -1048,7 +1159,7 @@ remove_operator_from_label_after_if_else@24: cover 2 frame_bury 0 assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:156 + // smart_contracts/asset_labeling/contract.py:162 // label_descriptor.num_operators > 1 or label_descriptor.num_assets == 0, extract 10 8 // on error: Index access is out of bounds pushbytes 0x0000000000000001 @@ -1056,7 +1167,7 @@ remove_operator_from_label_after_if_else@24: bnz remove_operator_from_label_bool_true@6 frame_dig 0 extract 2 8 // on error: Index access is out of bounds - bytec 7 // 0x0000000000000000 + bytec 9 // 0x0000000000000000 b== bz remove_operator_from_label_bool_false@7 @@ -1067,9 +1178,9 @@ remove_operator_from_label_bool_merge@8: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_operator_from_label_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:157 + // smart_contracts/asset_labeling/contract.py:163 // S("ERR:NOEMPTY"), - bytec 8 // "ERR:NOEMPTY" + bytec 10 // "ERR:NOEMPTY" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -1078,7 +1189,7 @@ remove_operator_from_label_bool_merge@8: err remove_operator_from_label_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:161 + // smart_contracts/asset_labeling/contract.py:167 // label_descriptor.num_operators.native - UInt64(1) frame_dig 0 dup @@ -1086,14 +1197,14 @@ remove_operator_from_label_after_if_else@20: extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:159-162 + // smart_contracts/asset_labeling/contract.py:165-168 // # decr operator count // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native - UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:163 + // smart_contracts/asset_labeling/contract.py:169 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -1101,7 +1212,7 @@ remove_operator_from_label_after_if_else@20: frame_dig -1 swap box_put - // smart_contracts/asset_labeling/contract.py:165 + // smart_contracts/asset_labeling/contract.py:171 // if self.operators[operator].length == 1: frame_dig -2 box_get @@ -1111,7 +1222,7 @@ remove_operator_from_label_after_if_else@20: intc_0 // 1 == bz remove_operator_from_label_else_body@10 - // smart_contracts/asset_labeling/contract.py:166 + // smart_contracts/asset_labeling/contract.py:172 // del self.operators[operator] frame_dig -2 box_del @@ -1119,11 +1230,11 @@ remove_operator_from_label_after_if_else@20: retsub remove_operator_from_label_else_body@10: - // smart_contracts/asset_labeling/contract.py:168 + // smart_contracts/asset_labeling/contract.py:174 // next_list = arc4.DynamicArray[arc4.String]() - bytec 11 // 0x0000 + bytec_2 // 0x0000 frame_bury 2 - // smart_contracts/asset_labeling/contract.py:169-172 + // smart_contracts/asset_labeling/contract.py:175-178 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1142,7 +1253,7 @@ remove_operator_from_label_else_body@10: frame_bury 6 remove_operator_from_label_for_header@11: - // smart_contracts/asset_labeling/contract.py:169-172 + // smart_contracts/asset_labeling/contract.py:175-178 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1167,14 +1278,14 @@ remove_operator_from_label_for_header@11: + extract3 frame_bury 4 - // smart_contracts/asset_labeling/contract.py:173 + // smart_contracts/asset_labeling/contract.py:179 // if label_idx != idx: frame_dig 7 != frame_dig 2 frame_bury 3 bz remove_operator_from_label_after_if_else@14 - // smart_contracts/asset_labeling/contract.py:174 + // smart_contracts/asset_labeling/contract.py:180 // next_list.append(stored_label) frame_dig 2 frame_dig 4 @@ -1192,7 +1303,7 @@ remove_operator_from_label_after_if_else@14: b remove_operator_from_label_for_header@11 remove_operator_from_label_after_for@16: - // smart_contracts/asset_labeling/contract.py:176 + // smart_contracts/asset_labeling/contract.py:182 // self.operators[operator] = next_list.copy() frame_dig -2 box_del @@ -1213,48 +1324,44 @@ remove_operator_from_label_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels(operator: bytes) -> bytes: get_operator_labels: - // smart_contracts/asset_labeling/contract.py:178-179 + // smart_contracts/asset_labeling/contract.py:184-185 // @abimethod(readonly=True) // def get_operator_labels(self, operator: Account) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:180 - // ensure(operator in self.operators, S("ERR:NOEXIST")) + // smart_contracts/asset_labeling/contract.py:186 + // if operator in self.operators: frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 - // if not cond: - bnz get_operator_labels_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:180 - // ensure(operator in self.operators, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:29 - // op.err() - err - -get_operator_labels_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:181 + bz get_operator_labels_after_if_else@2 + // smart_contracts/asset_labeling/contract.py:187 // return self.operators[operator] frame_dig -1 box_get assert // check self.operators entry exists retsub +get_operator_labels_after_if_else@2: + // smart_contracts/asset_labeling/contract.py:34 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + // smart_contracts/asset_labeling/contract.py:188-189 + // # return empty list + // return empty_list() + retsub + // smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset(label: bytes, asset: uint64) -> void: add_label_to_asset: - // smart_contracts/asset_labeling/contract.py:192-193 + // smart_contracts/asset_labeling/contract.py:200-201 // @abimethod() // def add_label_to_asset(self, label: String, asset: Asset) -> None: proto 2 0 intc_1 // 0 dup - bytec_2 // "" + bytec_1 // "" dup - // smart_contracts/asset_labeling/contract.py:194 + // smart_contracts/asset_labeling/contract.py:202 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len @@ -1262,7 +1369,7 @@ add_label_to_asset: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_label_to_asset_after_if_else@19 - // smart_contracts/asset_labeling/contract.py:194 + // smart_contracts/asset_labeling/contract.py:202 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1273,11 +1380,11 @@ add_label_to_asset: err add_label_to_asset_after_if_else@19: - // smart_contracts/asset_labeling/contract.py:196 + // smart_contracts/asset_labeling/contract.py:204 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:198 + // smart_contracts/asset_labeling/contract.py:206 // if asset in self.assets: frame_dig -1 itob @@ -1286,27 +1393,27 @@ add_label_to_asset_after_if_else@19: box_len bury 1 bz add_label_to_asset_else_body@2 - // smart_contracts/asset_labeling/contract.py:185 + // smart_contracts/asset_labeling/contract.py:193 // if asset not in self.assets: frame_dig 1 box_len bury 1 bnz add_label_to_asset_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:186 + // smart_contracts/asset_labeling/contract.py:194 // return UInt64(NOT_FOUND_KEY) intc 4 // 4294967296 add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12: - // smart_contracts/asset_labeling/contract.py:201 + // smart_contracts/asset_labeling/contract.py:209 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 == // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz add_label_to_asset_after_if_else@15 - // smart_contracts/asset_labeling/contract.py:202 + // smart_contracts/asset_labeling/contract.py:210 // S("ERR:EXISTS"), - bytec 4 // "ERR:EXISTS" + bytec 5 // "ERR:EXISTS" // smart_contracts/asset_labeling/contract.py:28 // log(msg) log @@ -1315,14 +1422,14 @@ add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLa err add_label_to_asset_after_if_else@15: - // smart_contracts/asset_labeling/contract.py:205-206 + // smart_contracts/asset_labeling/contract.py:213-214 // # add label to operator // existing = self.assets[asset].copy() frame_dig 1 dup box_get assert // check self.assets entry exists - // smart_contracts/asset_labeling/contract.py:207 + // smart_contracts/asset_labeling/contract.py:215 // existing.append(arc4.String(label)) frame_dig -2 len @@ -1332,7 +1439,7 @@ add_label_to_asset_after_if_else@15: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:208 + // smart_contracts/asset_labeling/contract.py:216 // self.assets[asset] = existing.copy() dig 1 box_del @@ -1340,26 +1447,26 @@ add_label_to_asset_after_if_else@15: box_put add_label_to_asset_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:213-214 + // smart_contracts/asset_labeling/contract.py:221-222 // # incr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:216 + // smart_contracts/asset_labeling/contract.py:224 // label_descriptor.num_assets.native + UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:215-217 + // smart_contracts/asset_labeling/contract.py:223-225 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native + UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:218 + // smart_contracts/asset_labeling/contract.py:226 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1370,7 +1477,7 @@ add_label_to_asset_after_if_else@3: retsub add_label_to_asset_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:187 + // smart_contracts/asset_labeling/contract.py:195 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 1 box_get @@ -1386,7 +1493,7 @@ add_label_to_asset_after_if_else@6: frame_bury 3 add_label_to_asset_for_header@7: - // smart_contracts/asset_labeling/contract.py:187 + // smart_contracts/asset_labeling/contract.py:195 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 3 frame_dig 2 @@ -1405,14 +1512,14 @@ add_label_to_asset_for_header@7: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:188 + // smart_contracts/asset_labeling/contract.py:196 // if stored_label == label: extract 2 0 frame_dig -2 == bz add_label_to_asset_after_if_else@10 frame_dig 3 - // smart_contracts/asset_labeling/contract.py:201 + // smart_contracts/asset_labeling/contract.py:209 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 @@ -1424,15 +1531,15 @@ add_label_to_asset_after_if_else@10: b add_label_to_asset_for_header@7 add_label_to_asset_after_for@11: - // smart_contracts/asset_labeling/contract.py:190 + // smart_contracts/asset_labeling/contract.py:198 // return UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:201 + // smart_contracts/asset_labeling/contract.py:209 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 add_label_to_asset_else_body@2: - // smart_contracts/asset_labeling/contract.py:210-211 + // smart_contracts/asset_labeling/contract.py:218-219 // # new operator, create new box // self.assets[asset] = arc4.DynamicArray(arc4.String(label)) frame_dig -2 @@ -1441,10 +1548,10 @@ add_label_to_asset_else_body@2: extract 6 2 frame_dig -2 concat - bytec 9 // 0x0002 + bytec 6 // 0x0002 swap concat - bytec 10 // 0x0001 + bytec 11 // 0x0001 swap concat frame_dig 1 @@ -1458,15 +1565,15 @@ add_label_to_asset_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset(label: bytes, asset: uint64) -> void: remove_label_from_asset: - // smart_contracts/asset_labeling/contract.py:220-221 + // smart_contracts/asset_labeling/contract.py:228-229 // @abimethod() // def remove_label_from_asset(self, label: String, asset: Asset) -> None: proto 2 0 intc_1 // 0 dupn 3 - bytec_2 // "" + bytec_1 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:222 + // smart_contracts/asset_labeling/contract.py:230 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len @@ -1474,7 +1581,7 @@ remove_label_from_asset: // smart_contracts/asset_labeling/contract.py:27 // if not cond: bnz remove_label_from_asset_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:222 + // smart_contracts/asset_labeling/contract.py:230 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1485,15 +1592,15 @@ remove_label_from_asset: err remove_label_from_asset_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:224 + // smart_contracts/asset_labeling/contract.py:232 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:226 + // smart_contracts/asset_labeling/contract.py:234 // found = False intc_1 // 0 frame_bury 5 - // smart_contracts/asset_labeling/contract.py:227 + // smart_contracts/asset_labeling/contract.py:235 // if self.assets[asset].length == 1: frame_dig -1 itob @@ -1506,7 +1613,7 @@ remove_label_from_asset_after_if_else@20: intc_0 // 1 == bz remove_label_from_asset_else_body@5 - // smart_contracts/asset_labeling/contract.py:228 + // smart_contracts/asset_labeling/contract.py:236 // if self.assets[asset][0] == label: frame_dig 3 box_get @@ -1529,12 +1636,12 @@ remove_label_from_asset_after_if_else@20: frame_dig -2 == bz remove_label_from_asset_else_body@3 - // smart_contracts/asset_labeling/contract.py:229 + // smart_contracts/asset_labeling/contract.py:237 // del self.assets[asset] frame_dig 3 box_del pop - // smart_contracts/asset_labeling/contract.py:230 + // smart_contracts/asset_labeling/contract.py:238 // found = True intc_0 // 1 frame_bury 5 @@ -1544,7 +1651,7 @@ remove_label_from_asset_after_if_else@13: // if not cond: frame_dig 5 bnz remove_label_from_asset_after_if_else@16 - // smart_contracts/asset_labeling/contract.py:245 + // smart_contracts/asset_labeling/contract.py:253 // ensure(found, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" // smart_contracts/asset_labeling/contract.py:28 @@ -1555,26 +1662,26 @@ remove_label_from_asset_after_if_else@13: err remove_label_from_asset_after_if_else@16: - // smart_contracts/asset_labeling/contract.py:247-248 + // smart_contracts/asset_labeling/contract.py:255-256 // # decr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:250 + // smart_contracts/asset_labeling/contract.py:258 // label_descriptor.num_assets.native - UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:249-251 + // smart_contracts/asset_labeling/contract.py:257-259 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native - UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:252 + // smart_contracts/asset_labeling/contract.py:260 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1585,18 +1692,18 @@ remove_label_from_asset_after_if_else@16: retsub remove_label_from_asset_else_body@3: - // smart_contracts/asset_labeling/contract.py:232 + // smart_contracts/asset_labeling/contract.py:240 // found = False intc_1 // 0 frame_bury 5 b remove_label_from_asset_after_if_else@13 remove_label_from_asset_else_body@5: - // smart_contracts/asset_labeling/contract.py:234 + // smart_contracts/asset_labeling/contract.py:242 // next_list = arc4.DynamicArray[arc4.String]() - bytec 11 // 0x0000 + bytec_2 // 0x0000 frame_bury 1 - // smart_contracts/asset_labeling/contract.py:235-237 + // smart_contracts/asset_labeling/contract.py:243-245 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1614,7 +1721,7 @@ remove_label_from_asset_else_body@5: frame_bury 6 remove_label_from_asset_for_header@6: - // smart_contracts/asset_labeling/contract.py:235-237 + // smart_contracts/asset_labeling/contract.py:243-245 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1637,13 +1744,13 @@ remove_label_from_asset_for_header@6: extract3 dup frame_bury 2 - // smart_contracts/asset_labeling/contract.py:238 + // smart_contracts/asset_labeling/contract.py:246 // if stored_label != label: extract 2 0 frame_dig -2 != bz remove_label_from_asset_else_body@9 - // smart_contracts/asset_labeling/contract.py:239 + // smart_contracts/asset_labeling/contract.py:247 // next_list.append(stored_label) frame_dig 1 frame_dig 2 @@ -1659,14 +1766,14 @@ remove_label_from_asset_after_if_else@10: b remove_label_from_asset_for_header@6 remove_label_from_asset_else_body@9: - // smart_contracts/asset_labeling/contract.py:241 + // smart_contracts/asset_labeling/contract.py:249 // found = True intc_0 // 1 frame_bury 5 b remove_label_from_asset_after_if_else@10 remove_label_from_asset_after_for@12: - // smart_contracts/asset_labeling/contract.py:243 + // smart_contracts/asset_labeling/contract.py:251 // self.assets[asset] = next_list.copy() frame_dig 3 dup @@ -1679,35 +1786,123 @@ remove_label_from_asset_after_for@12: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels(asset: uint64) -> bytes: get_asset_labels: - // smart_contracts/asset_labeling/contract.py:254-255 + // smart_contracts/asset_labeling/contract.py:262-263 // @abimethod(readonly=True) // def get_asset_labels(self, asset: Asset) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:256 - // ensure(asset in self.assets, S("ERR:NOEXIST")) + // smart_contracts/asset_labeling/contract.py:264 + // if asset in self.assets: frame_dig -1 itob dup box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 - // if not cond: - bnz get_asset_labels_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:256 - // ensure(asset in self.assets, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:29 - // op.err() - err - -get_asset_labels_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:257 + bz get_asset_labels_after_if_else@2 + // smart_contracts/asset_labeling/contract.py:265 // return self.assets[asset] frame_dig 0 box_get assert // check self.assets entry exists swap retsub + +get_asset_labels_after_if_else@2: + // smart_contracts/asset_labeling/contract.py:34 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + // smart_contracts/asset_labeling/contract.py:266-267 + // # return empty + // return empty_list() + swap + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels(assets: bytes) -> bytes: +get_assets_labels: + // smart_contracts/asset_labeling/contract.py:269-272 + // @abimethod(readonly=True) + // def get_assets_labels( + // self, assets: arc4.DynamicArray[arc4.UInt64] + // ) -> arc4.DynamicArray[LabelList]: + proto 1 1 + intc_1 // 0 + // smart_contracts/asset_labeling/contract.py:273 + // out = arc4.DynamicArray[LabelList]() + bytec_2 // 0x0000 + // smart_contracts/asset_labeling/contract.py:274 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_labels_for_header@1: + // smart_contracts/asset_labeling/contract.py:274 + // for _i, asset_id in uenumerate(assets): + frame_dig 3 + frame_dig 2 + < + bz get_assets_labels_after_for@7 + frame_dig -1 + extract 2 0 + frame_dig 3 + pushint 8 // 8 + * + // smart_contracts/asset_labeling/contract.py:275 + // asset = Asset(asset_id.native) + extract_uint64 + // smart_contracts/asset_labeling/contract.py:276 + // if asset in self.assets: + itob + dup + frame_bury 0 + box_len + bury 1 + bz get_assets_labels_else_body@4 + // smart_contracts/asset_labeling/contract.py:277 + // out.append(self.assets[asset].copy()) + frame_dig 0 + box_get + assert // check self.assets entry exists + bytec 6 // 0x0002 + swap + concat + frame_dig 1 + dup + intc_1 // 0 + extract_uint16 + swap + extract 2 0 + intc_0 // 1 + uncover 3 + callsub dynamic_array_concat_dynamic_element + frame_bury 1 + +get_assets_labels_after_if_else@5: + frame_dig 3 + intc_0 // 1 + + + frame_bury 3 + b get_assets_labels_for_header@1 + +get_assets_labels_else_body@4: + // smart_contracts/asset_labeling/contract.py:279 + // out.append(empty_list()) + frame_dig 1 + dup + intc_1 // 0 + extract_uint16 + swap + extract 2 0 + intc_0 // 1 + pushbytes 0x00020000 + callsub dynamic_array_concat_dynamic_element + frame_bury 1 + b get_assets_labels_after_if_else@5 + +get_assets_labels_after_for@7: + // smart_contracts/asset_labeling/contract.py:280 + // return out + frame_dig 1 + frame_bury 0 + retsub diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json index 53a47da..39dc20a 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json @@ -268,6 +268,27 @@ "readonly": true, "events": [], "recommendations": {} + }, + { + "name": "get_assets_labels", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "string[][]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} } ], "arcs": [ @@ -330,88 +351,91 @@ "sourceInfo": [ { "pc": [ - 690, - 1124, - 1143, - 1568 + 848, + 1282, + 1301, + 1724 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ - 208, - 230, - 254, - 278, - 300, - 324, - 348, - 363, - 385, - 403, - 427 + 215, + 235, + 258, + 282, + 306, + 329, + 353, + 377, + 392, + 415, + 433, + 457 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ - 450 + 480 ], "errorMessage": "can only call when creating" }, { "pc": [ - 211, - 233, - 257, - 281, - 303, - 327, - 351, - 366, - 388, - 406, - 430 + 218, + 238, + 261, + 285, + 309, + 332, + 356, + 380, + 395, + 418, + 436, + 460 ], "errorMessage": "can only call when not creating" }, { "pc": [ - 565, - 786 + 723, + 944 ], "errorMessage": "check self.admin exists" }, { "pc": [ - 1375, - 1425, - 1549, - 1560, - 1641, - 1742 + 1531, + 1581, + 1705, + 1716, + 1796, + 1894, + 1942 ], "errorMessage": "check self.assets entry exists" }, { "pc": [ - 689, - 725, - 768, - 1000, - 1123, - 1398, - 1604 + 847, + 883, + 926, + 1158, + 1281, + 1554, + 1760 ], "errorMessage": "check self.labels entry exists" }, { "pc": [ - 867, - 974, - 1182, - 1208, - 1315 + 1025, + 1132, + 1340, + 1365, + 1469 ], "errorMessage": "check self.operators entry exists" } @@ -424,11 +448,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBWFkbWluAAQVH3x1CkVSUjpFWElTVFMKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgACAgABAgAAMRhAAAQpMQBnMRtBAUOCCwSPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD82GgCOCwDdAMUAswCdAI4AdgBeAEgAMAAYAAIjQzEZFEQxGEQ2GgEXwDCIBd4rTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiATxIkMxGRREMRhENhoBVwIANhoCF8AwiAQUIkMxGRREMRhENhoBF8AciAPvK0xQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgC2SJDMRkURDEYRDYaARfAHDYaAlcCAIgCSSJDMRkURDEYRDYaAYgBcSJDMRkURDEYRDYaAVcCAIgBTCtMULAiQzEZFEQxGEQ2GgFXAgCIAQMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIAKQiQzEZFEQxGEQ2GgEXwByIAIciQzEZQP8MMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAIkxACMpZUQSQAAEJwWwAImKAQCI/+spi/9niYoCAIj/4Iv+vUUBQQAEJwSwAIv+FSQSQAAEJwawAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Zi/+9RQFAAAMosACL/xUkEkAABCcGsACL/75EVwIIJweoQAAEJwiwAIv/vEiJigEBi/+9RQFAAAMosACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIyllRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnBbAAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9ii/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcEsACL/r5Ei/8VFlcGAov/UCKI/eiL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwlMUCcKTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ki/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAw4sHIQQTQQC7IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJweoQQCKIkAABCcIsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiScLjAKL/r5MSU4CjAFEI1mMBSOMBosGiwUMQQA4iwFXAgCLBklOAiQLSwFMWUpZJAhYjASLBxOLAowDQQAKiwKLBCKI/NSMA4sDjAKLBiIIjAZC/8CL/rxIi/6LAr+JI0L/cyNC/0KKAQGL/71FAUAAAyiwAIv/vkSJigIAI0kqSYv+vUUBQAADKLAAi/6I/eKL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBLAAiwFJvkSL/hUWVwYCi/5QIoj8V0sBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnCUxQJwpMUIsBSbxITL9C/4mKAgAjRwMqRwKL/r1FAUAAAyiwAIv+iP0bI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90nC4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPsmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/fooBAYv/Fkm9RQFAAAMosACLAL5ETIk=", + "approval": "CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUAAIAAAVhZG1pbgQVH3x1CkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAQrMQBnMRtBAWGCDASPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD8Epn8DwjYaAI4MAPQA3ADKALMApACMAHQAXQBFAC0AFgACI0MxGRREMRhENhoBiAaLJwRMULAiQzEZFEQxGEQ2GgEXwDCIBl4nBExQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFcSJDMRkURDEYRDYaAVcCADYaAhfAMIgElCJDMRkURDEYRDYaARfAHIgEcCcETFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiANaIkMxGRREMRhENhoBF8AcNhoCVwIAiALKIkMxGRREMRhENhoBiAHyIkMxGRREMRhENhoBVwIAiAHNJwRMULAiQzEZFEQxGEQ2GgFXAgCIAYMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIASQiQzEZFEQxGEQ2GgEXwByIAQciQzEZQP71MRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAEpSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiTEAIytlRBJAAAQnB7AAiYoBAIj/6yuL/2eJigIAiP/gi/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5mL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjK2VEEkEAAYmL/4gAAYmKAQAxAIv/iAAfIQQTQQAVMQCL/4gAEiUTQQAJIkAABCcHsACJI0L/9IoCASMpSYv+vUUBQAAFIQSMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88ljACJigIAi/+I/2KL/71FAUAAAyiwAIv+vUUBQQBAi/6L/4j/hSUSQAAEJwWwAIv+vkSL/xUWVwYCi/9QIoj9aIv+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnBkxQJwtMUIv+vEiL/ky/Qv/NigIAI0cEKUcCi/+I/uSL/71FAUAAAyiwAIv+vUUBQAADKLAAi/6L/4j/BEmMByUTQQDCiwchBBNBALoiQAADKLAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxVjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0kpSYv+vUUBQAADKLAAi/6I/eSL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBbAAiwFJvkSL/hUWVwYCi/5QIoj72UsBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnBkxQJwtMUIsBSbxITL9C/4mKAgAjRwMpRwKL/r1FAUAAAyiwAIv+iP0dI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90qjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+qmMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9/igEBi/8WSb1FAUEABosAvkRMiSpMiYoBASMqi/8jWSOLA4sCDEEAT4v/VwIAiwOBCAtbFkmMAL1FAUEAIosAvkQnBkxQiwFJI1lMVwIAIk8DiPqkjAGLAyIIjANC/8GLAUkjWUxXAgAigAQAAgAAiPqGjAFC/9+LAYwAiQ==", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts index 55d6489..47363f9 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[690,1124,1143,1568],"errorMessage":"Index access is out of bounds"},{"pc":[208,230,254,278,300,324,348,363,385,403,427],"errorMessage":"OnCompletion is not NoOp"},{"pc":[450],"errorMessage":"can only call when creating"},{"pc":[211,233,257,281,303,327,351,366,388,406,430],"errorMessage":"can only call when not creating"},{"pc":[565,786],"errorMessage":"check self.admin exists"},{"pc":[1375,1425,1549,1560,1641,1742],"errorMessage":"check self.assets entry exists"},{"pc":[689,725,768,1000,1123,1398,1604],"errorMessage":"check self.labels entry exists"},{"pc":[867,974,1182,1208,1315],"errorMessage":"check self.operators entry exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiYWRtaW4iICIiIDB4MTUxZjdjNzUgIkVSUjpFWElTVFMiICJFUlI6VU5BVVRIIiAiRVJSOkxFTkdUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAyIDB4MDAwMSAweDAwMDAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTYKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjUKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MgogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDQgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU5LTYzCiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA2IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzAKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyA4IC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzgtNzkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEtOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1LTk2CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NwogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA0CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEyCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNCAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMi0xMjMKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMyLTEzNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjctMTI4CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDkgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQyCiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwCiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMtMTU0CiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjIKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY1CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2OS0xNzIKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjktMTcyCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTYKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczCiAgICAvLyBpZiBsYWJlbF9pZHggIT0gaWR4OgogICAgZnJhbWVfZGlnIDcKICAgICE9CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc0CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAzCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZm9yX2hlYWRlckAxMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9wdXQKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxzKG9wZXJhdG9yOiBieXRlcykgLT4gYnl0ZXM6CmdldF9vcGVyYXRvcl9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbHMoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyLTE5MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA0IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNS0yMDYKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTUtMjE3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg3CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAxCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMC0yMTEKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgOSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTAgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjAtMjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjQKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDctMjQ4CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlYyAxMSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNS0yMzcKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUtMjM3CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTQtMjU1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gZW5zdXJlKGFzc2V0IGluIHNlbGYuYXNzZXRzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBWFkbWluAAQVH3x1CkVSUjpFWElTVFMKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgACAgABAgAAMRhAAAQpMQBnMRtBAUOCCwSPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD82GgCOCwDdAMUAswCdAI4AdgBeAEgAMAAYAAIjQzEZFEQxGEQ2GgEXwDCIBd4rTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiATxIkMxGRREMRhENhoBVwIANhoCF8AwiAQUIkMxGRREMRhENhoBF8AciAPvK0xQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgC2SJDMRkURDEYRDYaARfAHDYaAlcCAIgCSSJDMRkURDEYRDYaAYgBcSJDMRkURDEYRDYaAVcCAIgBTCtMULAiQzEZFEQxGEQ2GgFXAgCIAQMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIAKQiQzEZFEQxGEQ2GgEXwByIAIciQzEZQP8MMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAIkxACMpZUQSQAAEJwWwAImKAQCI/+spi/9niYoCAIj/4Iv+vUUBQQAEJwSwAIv+FSQSQAAEJwawAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Zi/+9RQFAAAMosACL/xUkEkAABCcGsACL/75EVwIIJweoQAAEJwiwAIv/vEiJigEBi/+9RQFAAAMosACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIyllRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnBbAAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9ii/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcEsACL/r5Ei/8VFlcGAov/UCKI/eiL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwlMUCcKTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ki/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAw4sHIQQTQQC7IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJweoQQCKIkAABCcIsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiScLjAKL/r5MSU4CjAFEI1mMBSOMBosGiwUMQQA4iwFXAgCLBklOAiQLSwFMWUpZJAhYjASLBxOLAowDQQAKiwKLBCKI/NSMA4sDjAKLBiIIjAZC/8CL/rxIi/6LAr+JI0L/cyNC/0KKAQGL/71FAUAAAyiwAIv/vkSJigIAI0kqSYv+vUUBQAADKLAAi/6I/eKL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBLAAiwFJvkSL/hUWVwYCi/5QIoj8V0sBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnCUxQJwpMUIsBSbxITL9C/4mKAgAjRwMqRwKL/r1FAUAAAyiwAIv+iP0bI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90nC4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPsmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/fooBAYv/Fkm9RQFAAAMosACLAL5ETIk=","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[848,1282,1301,1724],"errorMessage":"Index access is out of bounds"},{"pc":[215,235,258,282,306,329,353,377,392,415,433,457],"errorMessage":"OnCompletion is not NoOp"},{"pc":[480],"errorMessage":"can only call when creating"},{"pc":[218,238,261,285,309,332,356,380,395,418,436,460],"errorMessage":"can only call when not creating"},{"pc":[723,944],"errorMessage":"check self.admin exists"},{"pc":[1531,1581,1705,1716,1796,1894,1942],"errorMessage":"check self.assets entry exists"},{"pc":[847,883,926,1158,1281,1554,1760],"errorMessage":"check self.labels entry exists"},{"pc":[1025,1132,1340,1365,1469],"errorMessage":"check self.operators entry exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUAAIAAAVhZG1pbgQVH3x1CkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAQrMQBnMRtBAWGCDASPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD8Epn8DwjYaAI4MAPQA3ADKALMApACMAHQAXQBFAC0AFgACI0MxGRREMRhENhoBiAaLJwRMULAiQzEZFEQxGEQ2GgEXwDCIBl4nBExQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFcSJDMRkURDEYRDYaAVcCADYaAhfAMIgElCJDMRkURDEYRDYaARfAHIgEcCcETFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiANaIkMxGRREMRhENhoBF8AcNhoCVwIAiALKIkMxGRREMRhENhoBiAHyIkMxGRREMRhENhoBVwIAiAHNJwRMULAiQzEZFEQxGEQ2GgFXAgCIAYMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIASQiQzEZFEQxGEQ2GgEXwByIAQciQzEZQP71MRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAEpSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiTEAIytlRBJAAAQnB7AAiYoBAIj/6yuL/2eJigIAiP/gi/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5mL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjK2VEEkEAAYmL/4gAAYmKAQAxAIv/iAAfIQQTQQAVMQCL/4gAEiUTQQAJIkAABCcHsACJI0L/9IoCASMpSYv+vUUBQAAFIQSMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88ljACJigIAi/+I/2KL/71FAUAAAyiwAIv+vUUBQQBAi/6L/4j/hSUSQAAEJwWwAIv+vkSL/xUWVwYCi/9QIoj9aIv+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnBkxQJwtMUIv+vEiL/ky/Qv/NigIAI0cEKUcCi/+I/uSL/71FAUAAAyiwAIv+vUUBQAADKLAAi/6L/4j/BEmMByUTQQDCiwchBBNBALoiQAADKLAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxVjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0kpSYv+vUUBQAADKLAAi/6I/eSL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBbAAiwFJvkSL/hUWVwYCi/5QIoj72UsBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnBkxQJwtMUIsBSbxITL9C/4mKAgAjRwMpRwKL/r1FAUAAAyiwAIv+iP0dI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90qjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+qmMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9/igEBi/8WSb1FAUEABosAvkRMiSpMiYoBASMqi/8jWSOLA4sCDEEAT4v/VwIAiwOBCAtbFkmMAL1FAUEAIosAvkQnBkxQiwFJI1lMVwIAIk8DiPqkjAGLAyIIjANC/8GLAUkjWUxXAgAigAQAAgAAiPqGjAFC/9+LAYwAiQ==","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -125,6 +125,9 @@ export type AssetLabelingArgs = { 'get_asset_labels(asset)string[]': { asset: bigint } + 'get_assets_labels(uint64[])string[][]': { + assets: bigint[] | number[] + } } /** * The tuple representation of the arguments for each method @@ -141,6 +144,7 @@ export type AssetLabelingArgs = { 'add_label_to_asset(string,asset)void': [label: string, asset: bigint] 'remove_label_from_asset(string,asset)void': [label: string, asset: bigint] 'get_asset_labels(asset)string[]': [asset: bigint] + 'get_assets_labels(uint64[])string[][]': [assets: bigint[] | number[]] } } @@ -159,6 +163,7 @@ export type AssetLabelingReturns = { 'add_label_to_asset(string,asset)void': void 'remove_label_from_asset(string,asset)void': void 'get_asset_labels(asset)string[]': string[] + 'get_assets_labels(uint64[])string[][]': string[][] } /** @@ -224,6 +229,11 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_asset_labels(asset)string[]'] returns: AssetLabelingReturns['get_asset_labels(asset)string[]'] }> + & Record<'get_assets_labels(uint64[])string[][]' | 'get_assets_labels', { + argsObj: AssetLabelingArgs['obj']['get_assets_labels(uint64[])string[][]'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_labels(uint64[])string[][]'] + returns: AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] + }> /** * Defines the shape of the state of the application. */ @@ -446,6 +456,19 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.asset], } } + /** + * Constructs a no op call for the get_assets_labels(uint64[])string[][] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_labels(uint64[])string[][]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } } /** @@ -804,6 +827,18 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + }, + } /** @@ -938,6 +973,18 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + }, + } /** @@ -1083,6 +1130,19 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_labels(asset)string[]'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_labels(uint64[])string[][]'])} + }, + } /** @@ -1147,6 +1207,19 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_asset_labels(asset)string[]'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] + } + /** * Methods to access state for the current AssetLabeling app */ @@ -1317,6 +1390,14 @@ export class AssetLabelingClient { resultMappers.push((v) => client.decodeReturnValue('get_asset_labels(asset)string[]', v)) return this }, + /** + * Add a get_assets_labels(uint64[])string[][] method call against the AssetLabeling contract + */ + getAssetsLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_assets_labels(uint64[])string[][]', v)) + return this + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -1451,6 +1532,15 @@ export type AssetLabelingComposer = { */ getAssetLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_labels(asset)string[]'] | undefined]> + /** + * Calls the get_assets_labels(uint64[])string[][] ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] | undefined]> + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index ad71a79..19c6348 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -29,6 +29,11 @@ def ensure(cond: bool, msg: String) -> None: # noqa: FBT001 op.err() +@subroutine +def empty_list() -> LabelList: + return arc4.DynamicArray[arc4.String]() + + class LabelDescriptor(arc4.Struct): name: arc4.String num_assets: arc4.UInt64 @@ -39,6 +44,7 @@ class AssetLabeling(ARC4Contract): def __init__(self) -> None: self.admin = Txn.sender self.labels = BoxMap(String, LabelDescriptor, key_prefix=b"") + # TODO does this need to be an asset? Uint64 could be better self.assets = BoxMap(Asset, LabelList, key_prefix=b"") self.operators = BoxMap(Account, LabelList, key_prefix=b"") @@ -177,8 +183,10 @@ def remove_operator_from_label(self, operator: Account, label: String) -> None: @abimethod(readonly=True) def get_operator_labels(self, operator: Account) -> LabelList: - ensure(operator in self.operators, S("ERR:NOEXIST")) - return self.operators[operator] + if operator in self.operators: + return self.operators[operator] + # return empty list + return empty_list() @subroutine def get_asset_label_index(self, asset: Asset, label: String) -> UInt64: @@ -253,5 +261,20 @@ def remove_label_from_asset(self, label: String, asset: Asset) -> None: @abimethod(readonly=True) def get_asset_labels(self, asset: Asset) -> LabelList: - ensure(asset in self.assets, S("ERR:NOEXIST")) - return self.assets[asset] + if asset in self.assets: + return self.assets[asset] + # return empty + return empty_list() + + @abimethod(readonly=True) + def get_assets_labels( + self, assets: arc4.DynamicArray[arc4.UInt64] + ) -> arc4.DynamicArray[LabelList]: + out = arc4.DynamicArray[LabelList]() + for _i, asset_id in uenumerate(assets): + asset = Asset(asset_id.native) + if asset in self.assets: + out.append(self.assets[asset].copy()) + else: + out.append(empty_list()) + return out From aefba7c40e92bf35af14df6e5c2b16d01d70fc57 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 16:01:29 +0300 Subject: [PATCH 05/15] fix failing contract tests --- projects/abel-sdk-v2/src/index.ts | 1 - .../asset_labeling-contracts/tests/asset-labeling.spec.ts | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index a85d7f9..a42f81d 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -137,7 +137,6 @@ export class AbelSDK { } async getAssetLabels(assetId: bigint): Promise { - // TODO should this throw NONEXIST if it is not labelled?? const { returns: [assetLabels], } = await wrapErrors( diff --git a/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts b/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts index cd9bb76..41f773c 100644 --- a/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts +++ b/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts @@ -266,7 +266,8 @@ describe('asset labeling contract', () => { await addOperatorToLabel(adminClient, adminAccount, id) await removeOperatorFromLabel(adminClient, adminAccount, id) - await expect(() => getOperatorLabels(adminClient, adminAccount)).rejects.toThrow(/ERR:NOEXIST/) + const emptyLabels = await getOperatorLabels(adminClient, adminAccount) + expect(emptyLabels).toEqual([]) const { numOperators } = await getLabelDescriptor(adminClient, id) expect(numOperators).toBe(0n) @@ -291,7 +292,6 @@ describe('asset labeling contract', () => { expect(operatorLabel).toBe(id2) await removeOperatorFromLabel(adminClient, adminAccount, id2) - await expect(() => getOperatorLabels(adminClient, adminAccount)).rejects.toThrow(/ERR:NOEXIST/) const { numOperators } = await getLabelDescriptor(adminClient, id) expect(numOperators).toBe(0n) @@ -316,7 +316,6 @@ describe('asset labeling contract', () => { expect(operatorLabel).toBe(id) await removeOperatorFromLabel(adminClient, adminAccount, id) - await expect(() => getOperatorLabels(adminClient, adminAccount)).rejects.toThrow(/ERR:NOEXIST/) const { numOperators } = await getLabelDescriptor(adminClient, id) expect(numOperators).toBe(0n) @@ -448,7 +447,8 @@ describe('asset labeling contract', () => { const labelDescriptor = await getLabelDescriptor(operatorClient, label) expect(labelDescriptor.numAssets).toBe(0n) - await expect(() => getAssetLabels(operatorClient, assetId)).rejects.toThrow(/ERR:NOEXIST/) + const emptyLabels = await getAssetLabels(operatorClient, assetId) + expect(emptyLabels).toEqual([]) }) test('remove non-existent label should fail', async () => { From 61c8a6feb2616ebd64ca67de2d6975bbb3ce9a03 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 17:13:50 +0300 Subject: [PATCH 06/15] batch fetch assets working end to end --- .../artifacts/AssetLabeling.arc32.json | 55 +- projects/abel-sdk-v2/cli/create-assets.ts | 32 + projects/abel-sdk-v2/cli/get-micro.ts | 38 + .../src/generated/abel-contract-client.ts | 195 +- projects/abel-sdk-v2/src/index.ts | 33 +- projects/abel-sdk-v2/src/types.ts | 5 + .../AssetLabeling.approval.puya.map | 3014 ++++++++++------- .../AssetLabeling.approval.teal | 694 ++-- .../asset_labeling/AssetLabeling.arc56.json | 170 +- .../asset_labeling/AssetLabelingClient.ts | 195 +- .../asset_labeling/contract.py | 30 +- .../smart_contracts/asset_labeling/types.py | 16 + 12 files changed, 3000 insertions(+), 1477 deletions(-) create mode 100644 projects/abel-sdk-v2/cli/create-assets.ts create mode 100644 projects/abel-sdk-v2/cli/get-micro.ts create mode 100644 projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py diff --git a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json index 4054ae5..4cc3d7e 100644 --- a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json +++ b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json @@ -83,10 +83,37 @@ "call_config": { "no_op": "CALL" } + }, + "get_asset_micro(uint64)(string,uint8)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetMicro", + "elements": [ + [ + "unit_name", + "string" + ], + [ + "decimals", + "uint8" + ] + ] + } + } + }, + "get_assets_micro(uint64[])void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -292,6 +319,32 @@ "returns": { "type": "string[][]" } + }, + { + "name": "get_asset_micro", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "readonly": true, + "returns": { + "type": "(string,uint8)" + } + }, + { + "name": "get_assets_micro", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "readonly": true, + "returns": { + "type": "void" + } } ], "networks": {} diff --git a/projects/abel-sdk-v2/cli/create-assets.ts b/projects/abel-sdk-v2/cli/create-assets.ts new file mode 100644 index 0000000..307dd92 --- /dev/null +++ b/projects/abel-sdk-v2/cli/create-assets.ts @@ -0,0 +1,32 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; +import { TransactionComposer } from "@algorandfoundation/algokit-utils/types/composer"; + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const { "last-round": lr } = await algorand.client.algod.status().do(); +const { + block: { tc }, +} = await algorand.client.algod.block(lr).do(); + +function addAsset(composer: TransactionComposer, times) { + for (let i = 1; i <= times; i++) { + composer = composer.addAssetCreate({ + assetName: `AN1${tc + i}`, + unitName: `UN${tc + i}`, + url: `URL${tc + i}`, + total: 1234567890n, + decimals: 10, + sender: deployer.addr, + }); + } + return composer; +} + +let composer = algorand.newGroup(); +addAsset(composer, 16); +const { txIds } = await composer.send(); +console.log(txIds); diff --git a/projects/abel-sdk-v2/cli/get-micro.ts b/projects/abel-sdk-v2/cli/get-micro.ts new file mode 100644 index 0000000..31b6d08 --- /dev/null +++ b/projects/abel-sdk-v2/cli/get-micro.ts @@ -0,0 +1,38 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +const start = BigInt(process.argv[2]) +const len = parseInt(process.argv[3], 10) + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer }); + +const assets = new Array(len).fill(0).map((_, i) => start+BigInt(i)) +console.log({ assets }) +console.log(await sdk.getAssetsMicro(assets)); diff --git a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts index b01ea98..19565b8 100644 --- a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts +++ b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract /** * A state record containing binary data @@ -79,6 +79,19 @@ export function LabelDescriptorFromTuple(abiTuple: [string, bigint, bigint]) { return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.LabelDescriptor, APP_SPEC.structs) as LabelDescriptor } +export type AssetMicro = { + unitName: string, + decimals: number +} + + +/** + * Converts the ABI tuple representation of a AssetMicro to the struct representation + */ +export function AssetMicroFromTuple(abiTuple: [string, number]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicro, APP_SPEC.structs) as AssetMicro +} + /** * The argument types for the AssetLabeling contract */ @@ -128,6 +141,12 @@ export type AssetLabelingArgs = { 'get_assets_labels(uint64[])string[][]': { assets: bigint[] | number[] } + 'get_asset_micro(uint64)(string,uint8)': { + asset: bigint | number + } + 'get_assets_micro(uint64[])void': { + assets: bigint[] | number[] + } } /** * The tuple representation of the arguments for each method @@ -145,6 +164,8 @@ export type AssetLabelingArgs = { 'remove_label_from_asset(string,asset)void': [label: string, asset: bigint] 'get_asset_labels(asset)string[]': [asset: bigint] 'get_assets_labels(uint64[])string[][]': [assets: bigint[] | number[]] + 'get_asset_micro(uint64)(string,uint8)': [asset: bigint | number] + 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] } } @@ -164,6 +185,8 @@ export type AssetLabelingReturns = { 'remove_label_from_asset(string,asset)void': void 'get_asset_labels(asset)string[]': string[] 'get_assets_labels(uint64[])string[][]': string[][] + 'get_asset_micro(uint64)(string,uint8)': AssetMicro + 'get_assets_micro(uint64[])void': void } /** @@ -234,6 +257,16 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_assets_labels(uint64[])string[][]'] returns: AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] }> + & Record<'get_asset_micro(uint64)(string,uint8)' | 'get_asset_micro', { + argsObj: AssetLabelingArgs['obj']['get_asset_micro(uint64)(string,uint8)'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_micro(uint64)(string,uint8)'] + returns: AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] + }> + & Record<'get_assets_micro(uint64[])void' | 'get_assets_micro', { + argsObj: AssetLabelingArgs['obj']['get_assets_micro(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_micro(uint64[])void'] + returns: AssetLabelingReturns['get_assets_micro(uint64[])void'] + }> /** * Defines the shape of the state of the application. */ @@ -456,6 +489,32 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.assets], } } + /** + * Constructs a no op call for the get_asset_micro(uint64)(string,uint8) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_micro(uint64)(string,uint8)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_micro(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_micro(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } } /** @@ -826,6 +885,30 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + }, + } /** @@ -972,6 +1055,30 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + }, + } /** @@ -1130,6 +1237,32 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_labels(uint64[])string[][]'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro(uint64[])void'])} + }, + } /** @@ -1207,6 +1340,32 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetMicro(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsMicro(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_micro(uint64[])void'] + } + /** * Methods to access state for the current AssetLabeling app */ @@ -1333,6 +1492,22 @@ export class AssetLabelingClient { resultMappers.push((v) => client.decodeReturnValue('get_assets_labels(uint64[])string[][]', v)) return this }, + /** + * Add a get_asset_micro(uint64)(string,uint8) method call against the AssetLabeling contract + */ + getAssetMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetMicro(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_micro(uint64)(string,uint8)', v)) + return this + }, + /** + * Add a get_assets_micro(uint64[])void method call against the AssetLabeling contract + */ + getAssetsMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsMicro(params))) + resultMappers.push(undefined) + return this + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -1476,6 +1651,24 @@ export type AssetLabelingComposer = { */ getAssetsLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] | undefined]> + /** + * Calls the get_asset_micro(uint64)(string,uint8) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] | undefined]> + + /** + * Calls the get_assets_micro(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro(uint64[])void'] | undefined]> + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index a42f81d..6e6398b 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -5,6 +5,8 @@ import { BoxName } from "@algorandfoundation/algokit-utils/types/app"; import { AssetLabelingClient, AssetLabelingFactory, + AssetMicro, + AssetMicroFromTuple, LabelDescriptorFromTuple as LabelDescriptorBoxValueFromTuple, } from "./generated/abel-contract-client.js"; import { AnyFn, LabelDescriptor } from "./types.js"; @@ -88,7 +90,7 @@ export class AbelSDK { } = await wrapErrors( this.readClient .newGroup() - .getLabel({ args: { id: labelId }, boxReferences: [labelId] }) + .getLabel({ args: { id: labelId } }) .simulate(SIMULATE_PARAMS) ); return { id: labelId, ...labelDescriptorValue! }; @@ -105,16 +107,14 @@ export class AbelSDK { const { confirmations } = await wrapErrors( this.readClient .newGroup() - .logLabels({ args: { ids: labelIds }, boxReferences: labelIds }) + .logLabels({ args: { ids: labelIds } }) .simulate(SIMULATE_PARAMS) ); const logs = confirmations[0]!.logs ?? []; - - const labelDescriptors: Map = new Map(); - const descriptorValues = this.parseLogsAs(logs, LabelDescriptorBoxValueFromTuple, "get_label"); + const labelDescriptors: Map = new Map(); descriptorValues.forEach((descriptorValue, idx) => { const id = labelIds[idx]; labelDescriptors.set(id, { id, ...descriptorValue }); @@ -129,7 +129,7 @@ export class AbelSDK { } = await wrapErrors( this.readClient .newGroup() - .getOperatorLabels({ args: { operator }, boxReferences: [operator] }) + .getOperatorLabels({ args: { operator } }) .simulate(SIMULATE_PARAMS) ); @@ -142,7 +142,7 @@ export class AbelSDK { } = await wrapErrors( this.readClient .newGroup() - .getAssetLabels({ args: { asset: assetId }, boxReferences: [encodeUint64(assetId)] }) + .getAssetLabels({ args: { asset: assetId } }) .simulate(SIMULATE_PARAMS) ); @@ -155,7 +155,7 @@ export class AbelSDK { } = await wrapErrors( this.readClient .newGroup() - .getAssetsLabels({ args: { assets: assetIds }, boxReferences: assetIds.map((a) => encodeUint64(a)) }) + .getAssetsLabels({ args: { assets: assetIds } }) .simulate(SIMULATE_PARAMS) ); @@ -247,6 +247,23 @@ export class AbelSDK { return wrapErrors(query); } + /* Batch fetch asset views */ + async getAssetsMicro(assetIds: bigint[]): Promise> { + const { confirmations } = await wrapErrors( + this.readClient + .newGroup() + .getAssetsMicro({ args: { assets: assetIds } }) + .simulate(SIMULATE_PARAMS) + ); + + const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetMicroFromTuple, "get_asset_micro"); + + return new Map(assetValues.map((descriptorValue, idx) => { + const id = assetIds[idx]; + return [id, { id, ...descriptorValue }] + })); + } + /* Utils */ private async getBoxesByLength(length: number): Promise { diff --git a/projects/abel-sdk-v2/src/types.ts b/projects/abel-sdk-v2/src/types.ts index 15d5ebb..9006516 100644 --- a/projects/abel-sdk-v2/src/types.ts +++ b/projects/abel-sdk-v2/src/types.ts @@ -1,5 +1,6 @@ import { LabelDescriptor as LabelDescriptorBoxValue, + AssetMicro as AssetMicroValue, } from "./generated/abel-contract-client.js"; export interface LabelDescriptor extends LabelDescriptorBoxValue { @@ -7,3 +8,7 @@ export interface LabelDescriptor extends LabelDescriptorBoxValue { } export type AnyFn = (...args: any[]) => any; + +export interface AssetMicro extends AssetMicroValue { + id: bigint; +} diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map index 7f96a3b..7a35042 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map @@ -3,7 +3,7 @@ "sources": [ "../../asset_labeling/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CQ;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAkOK;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUe;;AAAc;AAAA;AAAA;AAAA;AAAd;AA1BR;;;AA0BkC;;AAzBjC;AACA;;AA0BR;;;AAEQ;;;AACA;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AApCR;;;AAoC+B;;AAnC9B;AACA;AAmCO;;AAAA;AAAmB;AAAnB;AArCR;;;AAqC8B;;AApC7B;AACA;AAqCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA/CR;;;AA+C2B;AA9C1B;AACA;AA8CO;;AAAA;AAAmB;AAAnB;AAhDR;;;AAgD8B;;AA/C7B;AACA;AA+CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAjDR;;;AAiDyC;;AAhDxC;AACA;AAgDA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AAtDR;;;AAsD2B;AArD1B;AACA;AAqDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;AADC;AADJ;;;;AAzEL;;;AA4EK;;AA3EJ;AACA;;;;;;AA6ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA3FR;;;AA2F8B;AA1F7B;AACA;AA2FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;AADH;AAhGT;;;AAkGS;;AAjGR;AACA;AAoGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAxHR;;;AAwH8B;AAvH7B;AACA;AAuHO;;AAAA;AAAA;;AAzHR;;;AAyHoC;AAxHnC;AACA;AA0HA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA9HL;;;AAiIK;AAhIJ;AACA;AAmImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAvIL;;;AAwIK;;AAvIJ;AACA;AA0II;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAzJD;AA2JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA/KR;;;AA+K8B;AA9K7B;AACA;AA+KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;AAA5C;AAtLT;;;AAuLS;;AAtLR;AACA;AAyLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA3MR;;;AA2M8B;AA1M7B;AACA;AA2MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAnNT;;AAAA;;;AAkOe;AAjOd;AACA;AAmOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAvOD;AAyOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CQ;;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AA4PK;;AAAA;AAAA;AAAA;;AAAA;AA5PL;;;AA4PK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAxPL;;;AAAA;AAwPK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAzBR;;;AAyBkC;;AAxBjC;AACA;;AAyBR;;;AAEQ;;;AACA;;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AAnCR;;;AAmC+B;;AAlC9B;AACA;AAkCO;;AAAA;AAAmB;AAAnB;AApCR;;;AAoC8B;;AAnC7B;AACA;AAoCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9CR;;;AA8C2B;AA7C1B;AACA;AA6CO;;AAAA;AAAmB;AAAnB;AA/CR;;;AA+C8B;;AA9C7B;AACA;AA8CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAhDR;;;AAgDyC;;AA/CxC;AACA;AA+CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AArDR;;;AAqD2B;AApD1B;AACA;AAoDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;AADC;AADJ;;;;AAxEL;;;AA2EK;;AA1EJ;AACA;;;;;;AA4ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA1FR;;;AA0F8B;AAzF7B;AACA;AA0FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;AADH;AA/FT;;;AAiGS;;AAhGR;AACA;AAmGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAvHR;;;AAuH8B;AAtH7B;AACA;AAsHO;;AAAA;AAAA;;AAxHR;;;AAwHoC;AAvHnC;AACA;AAyHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA7HL;;;AAgIK;AA/HJ;AACA;AAkImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAtIL;;;AAuIK;;AAtIJ;AACA;AAyII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAxJD;AA0JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA9KR;;;AA8K8B;AA7K7B;AACA;AA8KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;AAA5C;AArLT;;;AAsLS;;AArLR;AACA;AAwLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA1MR;;;AA0M8B;AAzM7B;AACA;AA0MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAlNT;;AAAA;;;AAiOe;AAhOd;AACA;AAkOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAtOD;AAwOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA;AAGR;;;AAI4B;;AAAA;;AAAA;AAvPjB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAwPqB;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAFN;;;;AAAA;AAAA;AAAA;AAAA;AAAP;AAKR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -14,7 +14,7 @@ "op": "intcblock 1 0 2 4294967295 4294967296" }, "16": { - "op": "bytecblock \"ERR:NOEXIST\" \"\" 0x0000 \"admin\" 0x151f7c75 \"ERR:EXISTS\" 0x0002 \"ERR:UNAUTH\" \"ERR:LENGTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0001" + "op": "bytecblock \"ERR:NOEXIST\" 0x151f7c75 \"\" 0x0000 \"admin\" \"ERR:EXISTS\" 0x0002 \"ERR:UNAUTH\" \"ERR:LENGTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0001" }, "105": { "op": "txn ApplicationID", @@ -30,7 +30,7 @@ "stack_out": [] }, "110": { - "op": "bytec_3 // \"admin\"", + "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"" ], @@ -38,7 +38,7 @@ "\"admin\"" ] }, - "111": { + "112": { "op": "txn Sender", "defined_out": [ "\"admin\"", @@ -49,11 +49,11 @@ "new_state_value%0#0" ] }, - "113": { + "114": { "op": "app_global_put", "stack_out": [] }, - "114": { + "115": { "block": "main_after_if_else@2", "stack_in": [], "op": "txn NumAppArgs", @@ -64,19 +64,21 @@ "tmp%0#2" ] }, - "116": { - "op": "bz main_bare_routing@17", + "117": { + "op": "bz main_bare_routing@19", "stack_out": [] }, - "119": { - "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\"", + "120": { + "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\", method \"get_asset_micro(uint64)(string,uint8)\", method \"get_assets_micro(uint64[])void\"", "defined_out": [ "Method(add_label(string,string)void)", "Method(add_label_to_asset(string,asset)void)", "Method(add_operator_to_label(account,string)void)", "Method(change_admin(account)void)", "Method(get_asset_labels(asset)string[])", + "Method(get_asset_micro(uint64)(string,uint8))", "Method(get_assets_labels(uint64[])string[][])", + "Method(get_assets_micro(uint64[])void)", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", "Method(log_labels(string[])void)", @@ -96,10 +98,12 @@ "Method(add_label_to_asset(string,asset)void)", "Method(remove_label_from_asset(string,asset)void)", "Method(get_asset_labels(asset)string[])", - "Method(get_assets_labels(uint64[])string[][])" + "Method(get_assets_labels(uint64[])string[][])", + "Method(get_asset_micro(uint64)(string,uint8))", + "Method(get_assets_micro(uint64[])void)" ] }, - "181": { + "192": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(add_label(string,string)void)", @@ -107,7 +111,9 @@ "Method(add_operator_to_label(account,string)void)", "Method(change_admin(account)void)", "Method(get_asset_labels(asset)string[])", + "Method(get_asset_micro(uint64)(string,uint8))", "Method(get_assets_labels(uint64[])string[][])", + "Method(get_assets_micro(uint64[])void)", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", "Method(log_labels(string[])void)", @@ -129,15 +135,17 @@ "Method(remove_label_from_asset(string,asset)void)", "Method(get_asset_labels(asset)string[])", "Method(get_assets_labels(uint64[])string[][])", + "Method(get_asset_micro(uint64)(string,uint8))", + "Method(get_assets_micro(uint64[])void)", "tmp%2#0" ] }, - "184": { - "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16", + "195": { + "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18", "stack_out": [] }, - "210": { - "block": "main_after_if_else@19", + "225": { + "block": "main_after_if_else@21", "stack_in": [], "op": "intc_1 // 0", "defined_out": [ @@ -147,11 +155,188 @@ "tmp%0#0" ] }, - "211": { + "226": { + "op": "return", + "stack_out": [] + }, + "227": { + "block": "main_get_assets_micro_route@18", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%98#0" + ], + "stack_out": [ + "tmp%98#0" + ] + }, + "229": { + "op": "!", + "defined_out": [ + "tmp%99#0" + ], + "stack_out": [ + "tmp%99#0" + ] + }, + "230": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "231": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%100#0" + ], + "stack_out": [ + "tmp%100#0" + ] + }, + "233": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "234": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%102#0" + ], + "stack_out": [ + "tmp%102#0" + ] + }, + "237": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", + "op": "callsub get_assets_micro", + "stack_out": [] + }, + "240": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "241": { + "op": "return", + "stack_out": [] + }, + "242": { + "block": "main_get_asset_micro_route@17", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%91#0" + ], + "stack_out": [ + "tmp%91#0" + ] + }, + "244": { + "op": "!", + "defined_out": [ + "tmp%92#0" + ], + "stack_out": [ + "tmp%92#0" + ] + }, + "245": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "246": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%93#0" + ], + "stack_out": [ + "tmp%93#0" + ] + }, + "248": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "249": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[8]%0#0" + ], + "stack_out": [ + "reinterpret_bytes[8]%0#0" + ] + }, + "252": { + "op": "btoi", + "defined_out": [ + "tmp%95#0" + ], + "stack_out": [ + "tmp%95#0" + ] + }, + "253": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", + "op": "callsub get_asset_micro", + "defined_out": [ + "tmp%96#0" + ], + "stack_out": [ + "tmp%96#0" + ] + }, + "256": { + "op": "bytec_1 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%96#0" + ], + "stack_out": [ + "tmp%96#0", + "0x151f7c75" + ] + }, + "257": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%96#0" + ] + }, + "258": { + "op": "concat", + "defined_out": [ + "tmp%97#0" + ], + "stack_out": [ + "tmp%97#0" + ] + }, + "259": { + "op": "log", + "stack_out": [] + }, + "260": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "261": { "op": "return", "stack_out": [] }, - "212": { + "262": { "block": "main_get_assets_labels_route@16", "stack_in": [], "op": "txn OnCompletion", @@ -162,7 +347,7 @@ "tmp%84#0" ] }, - "214": { + "264": { "op": "!", "defined_out": [ "tmp%85#0" @@ -171,12 +356,12 @@ "tmp%85#0" ] }, - "215": { + "265": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "216": { + "266": { "op": "txn ApplicationID", "defined_out": [ "tmp%86#0" @@ -185,12 +370,12 @@ "tmp%86#0" ] }, - "218": { + "268": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "219": { + "269": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%88#0" @@ -199,7 +384,7 @@ "tmp%88#0" ] }, - "222": { + "272": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", "op": "callsub get_assets_labels", "defined_out": [ @@ -209,8 +394,8 @@ "tmp%89#0" ] }, - "225": { - "op": "bytec 4 // 0x151f7c75", + "275": { + "op": "bytec_1 // 0x151f7c75", "defined_out": [ "0x151f7c75", "tmp%89#0" @@ -220,14 +405,14 @@ "0x151f7c75" ] }, - "227": { + "276": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%89#0" ] }, - "228": { + "277": { "op": "concat", "defined_out": [ "tmp%90#0" @@ -236,11 +421,11 @@ "tmp%90#0" ] }, - "229": { + "278": { "op": "log", "stack_out": [] }, - "230": { + "279": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -249,11 +434,11 @@ "tmp%0#0" ] }, - "231": { + "280": { "op": "return", "stack_out": [] }, - "232": { + "281": { "block": "main_get_asset_labels_route@15", "stack_in": [], "op": "txn OnCompletion", @@ -264,7 +449,7 @@ "tmp%76#0" ] }, - "234": { + "283": { "op": "!", "defined_out": [ "tmp%77#0" @@ -273,12 +458,12 @@ "tmp%77#0" ] }, - "235": { + "284": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "236": { + "285": { "op": "txn ApplicationID", "defined_out": [ "tmp%78#0" @@ -287,12 +472,12 @@ "tmp%78#0" ] }, - "238": { + "287": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "239": { + "288": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%6#0" @@ -301,7 +486,7 @@ "reinterpret_bytes[1]%6#0" ] }, - "242": { + "291": { "op": "btoi", "defined_out": [ "tmp%80#0" @@ -310,7 +495,7 @@ "tmp%80#0" ] }, - "243": { + "292": { "op": "txnas Assets", "defined_out": [ "tmp%81#0" @@ -319,7 +504,7 @@ "tmp%81#0" ] }, - "245": { + "294": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", "op": "callsub get_asset_labels", "defined_out": [ @@ -329,8 +514,8 @@ "tmp%82#0" ] }, - "248": { - "op": "bytec 4 // 0x151f7c75", + "297": { + "op": "bytec_1 // 0x151f7c75", "defined_out": [ "0x151f7c75", "tmp%82#0" @@ -340,14 +525,14 @@ "0x151f7c75" ] }, - "250": { + "298": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%82#0" ] }, - "251": { + "299": { "op": "concat", "defined_out": [ "tmp%83#0" @@ -356,11 +541,11 @@ "tmp%83#0" ] }, - "252": { + "300": { "op": "log", "stack_out": [] }, - "253": { + "301": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -369,11 +554,11 @@ "tmp%0#0" ] }, - "254": { + "302": { "op": "return", "stack_out": [] }, - "255": { + "303": { "block": "main_remove_label_from_asset_route@14", "stack_in": [], "op": "txn OnCompletion", @@ -384,7 +569,7 @@ "tmp%68#0" ] }, - "257": { + "305": { "op": "!", "defined_out": [ "tmp%69#0" @@ -393,12 +578,12 @@ "tmp%69#0" ] }, - "258": { + "306": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "259": { + "307": { "op": "txn ApplicationID", "defined_out": [ "tmp%70#0" @@ -407,12 +592,12 @@ "tmp%70#0" ] }, - "261": { + "309": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "262": { + "310": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%72#0" @@ -421,7 +606,7 @@ "tmp%72#0" ] }, - "265": { + "313": { "op": "extract 2 0", "defined_out": [ "tmp%73#0" @@ -430,7 +615,7 @@ "tmp%73#0" ] }, - "268": { + "316": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%5#0", @@ -441,7 +626,7 @@ "reinterpret_bytes[1]%5#0" ] }, - "271": { + "319": { "op": "btoi", "defined_out": [ "tmp%73#0", @@ -452,7 +637,7 @@ "tmp%74#0" ] }, - "272": { + "320": { "op": "txnas Assets", "defined_out": [ "tmp%73#0", @@ -463,12 +648,12 @@ "tmp%75#0" ] }, - "274": { + "322": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", "op": "callsub remove_label_from_asset", "stack_out": [] }, - "277": { + "325": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -477,11 +662,11 @@ "tmp%0#0" ] }, - "278": { + "326": { "op": "return", "stack_out": [] }, - "279": { + "327": { "block": "main_add_label_to_asset_route@13", "stack_in": [], "op": "txn OnCompletion", @@ -492,7 +677,7 @@ "tmp%60#0" ] }, - "281": { + "329": { "op": "!", "defined_out": [ "tmp%61#0" @@ -501,12 +686,12 @@ "tmp%61#0" ] }, - "282": { + "330": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "283": { + "331": { "op": "txn ApplicationID", "defined_out": [ "tmp%62#0" @@ -515,12 +700,12 @@ "tmp%62#0" ] }, - "285": { + "333": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "286": { + "334": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%64#0" @@ -529,7 +714,7 @@ "tmp%64#0" ] }, - "289": { + "337": { "op": "extract 2 0", "defined_out": [ "tmp%65#0" @@ -538,7 +723,7 @@ "tmp%65#0" ] }, - "292": { + "340": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%4#0", @@ -549,7 +734,7 @@ "reinterpret_bytes[1]%4#0" ] }, - "295": { + "343": { "op": "btoi", "defined_out": [ "tmp%65#0", @@ -560,7 +745,7 @@ "tmp%66#0" ] }, - "296": { + "344": { "op": "txnas Assets", "defined_out": [ "tmp%65#0", @@ -571,12 +756,12 @@ "tmp%67#0" ] }, - "298": { + "346": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", "op": "callsub add_label_to_asset", "stack_out": [] }, - "301": { + "349": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -585,11 +770,11 @@ "tmp%0#0" ] }, - "302": { + "350": { "op": "return", "stack_out": [] }, - "303": { + "351": { "block": "main_get_operator_labels_route@12", "stack_in": [], "op": "txn OnCompletion", @@ -600,7 +785,7 @@ "tmp%52#0" ] }, - "305": { + "353": { "op": "!", "defined_out": [ "tmp%53#0" @@ -609,12 +794,12 @@ "tmp%53#0" ] }, - "306": { + "354": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "307": { + "355": { "op": "txn ApplicationID", "defined_out": [ "tmp%54#0" @@ -623,12 +808,12 @@ "tmp%54#0" ] }, - "309": { + "357": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "310": { + "358": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%3#0" @@ -637,7 +822,7 @@ "reinterpret_bytes[1]%3#0" ] }, - "313": { + "361": { "op": "btoi", "defined_out": [ "tmp%56#0" @@ -646,7 +831,7 @@ "tmp%56#0" ] }, - "314": { + "362": { "op": "txnas Accounts", "defined_out": [ "tmp%57#0" @@ -655,7 +840,7 @@ "tmp%57#0" ] }, - "316": { + "364": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", "op": "callsub get_operator_labels", "defined_out": [ @@ -665,8 +850,8 @@ "tmp%58#0" ] }, - "319": { - "op": "bytec 4 // 0x151f7c75", + "367": { + "op": "bytec_1 // 0x151f7c75", "defined_out": [ "0x151f7c75", "tmp%58#0" @@ -676,14 +861,14 @@ "0x151f7c75" ] }, - "321": { + "368": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%58#0" ] }, - "322": { + "369": { "op": "concat", "defined_out": [ "tmp%59#0" @@ -692,11 +877,11 @@ "tmp%59#0" ] }, - "323": { + "370": { "op": "log", "stack_out": [] }, - "324": { + "371": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -705,11 +890,11 @@ "tmp%0#0" ] }, - "325": { + "372": { "op": "return", "stack_out": [] }, - "326": { + "373": { "block": "main_remove_operator_from_label_route@11", "stack_in": [], "op": "txn OnCompletion", @@ -720,7 +905,7 @@ "tmp%44#0" ] }, - "328": { + "375": { "op": "!", "defined_out": [ "tmp%45#0" @@ -729,12 +914,12 @@ "tmp%45#0" ] }, - "329": { + "376": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "330": { + "377": { "op": "txn ApplicationID", "defined_out": [ "tmp%46#0" @@ -743,12 +928,12 @@ "tmp%46#0" ] }, - "332": { + "379": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "333": { + "380": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%2#0" @@ -757,7 +942,7 @@ "reinterpret_bytes[1]%2#0" ] }, - "336": { + "383": { "op": "btoi", "defined_out": [ "tmp%48#0" @@ -766,7 +951,7 @@ "tmp%48#0" ] }, - "337": { + "384": { "op": "txnas Accounts", "defined_out": [ "tmp%49#0" @@ -775,7 +960,7 @@ "tmp%49#0" ] }, - "339": { + "386": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%49#0", @@ -786,7 +971,7 @@ "tmp%50#0" ] }, - "342": { + "389": { "op": "extract 2 0", "defined_out": [ "tmp%49#0", @@ -797,12 +982,12 @@ "tmp%51#0" ] }, - "345": { + "392": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", "op": "callsub remove_operator_from_label", "stack_out": [] }, - "348": { + "395": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -811,11 +996,11 @@ "tmp%0#0" ] }, - "349": { + "396": { "op": "return", "stack_out": [] }, - "350": { + "397": { "block": "main_add_operator_to_label_route@10", "stack_in": [], "op": "txn OnCompletion", @@ -826,7 +1011,7 @@ "tmp%36#0" ] }, - "352": { + "399": { "op": "!", "defined_out": [ "tmp%37#0" @@ -835,12 +1020,12 @@ "tmp%37#0" ] }, - "353": { + "400": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "354": { + "401": { "op": "txn ApplicationID", "defined_out": [ "tmp%38#0" @@ -849,12 +1034,12 @@ "tmp%38#0" ] }, - "356": { + "403": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "357": { + "404": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%1#0" @@ -863,7 +1048,7 @@ "reinterpret_bytes[1]%1#0" ] }, - "360": { + "407": { "op": "btoi", "defined_out": [ "tmp%40#0" @@ -872,7 +1057,7 @@ "tmp%40#0" ] }, - "361": { + "408": { "op": "txnas Accounts", "defined_out": [ "tmp%41#0" @@ -881,7 +1066,7 @@ "tmp%41#0" ] }, - "363": { + "410": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%41#0", @@ -892,7 +1077,7 @@ "tmp%42#0" ] }, - "366": { + "413": { "op": "extract 2 0", "defined_out": [ "tmp%41#0", @@ -903,12 +1088,12 @@ "tmp%43#0" ] }, - "369": { + "416": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", "op": "callsub add_operator_to_label", "stack_out": [] }, - "372": { + "419": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -917,11 +1102,11 @@ "tmp%0#0" ] }, - "373": { + "420": { "op": "return", "stack_out": [] }, - "374": { + "421": { "block": "main_log_labels_route@9", "stack_in": [], "op": "txn OnCompletion", @@ -932,7 +1117,7 @@ "tmp%31#0" ] }, - "376": { + "423": { "op": "!", "defined_out": [ "tmp%32#0" @@ -941,12 +1126,12 @@ "tmp%32#0" ] }, - "377": { + "424": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "378": { + "425": { "op": "txn ApplicationID", "defined_out": [ "tmp%33#0" @@ -955,12 +1140,12 @@ "tmp%33#0" ] }, - "380": { + "427": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "381": { + "428": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%35#0" @@ -969,12 +1154,12 @@ "tmp%35#0" ] }, - "384": { + "431": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", "op": "callsub log_labels", "stack_out": [] }, - "387": { + "434": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -983,11 +1168,11 @@ "tmp%0#0" ] }, - "388": { + "435": { "op": "return", "stack_out": [] }, - "389": { + "436": { "block": "main_get_label_route@8", "stack_in": [], "op": "txn OnCompletion", @@ -998,7 +1183,7 @@ "tmp%23#0" ] }, - "391": { + "438": { "op": "!", "defined_out": [ "tmp%24#0" @@ -1007,12 +1192,12 @@ "tmp%24#0" ] }, - "392": { + "439": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "393": { + "440": { "op": "txn ApplicationID", "defined_out": [ "tmp%25#0" @@ -1021,12 +1206,12 @@ "tmp%25#0" ] }, - "395": { + "442": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "396": { + "443": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%27#0" @@ -1035,7 +1220,7 @@ "tmp%27#0" ] }, - "399": { + "446": { "op": "extract 2 0", "defined_out": [ "tmp%28#0" @@ -1044,7 +1229,7 @@ "tmp%28#0" ] }, - "402": { + "449": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "op": "callsub get_label", "defined_out": [ @@ -1054,8 +1239,8 @@ "tmp%29#0" ] }, - "405": { - "op": "bytec 4 // 0x151f7c75", + "452": { + "op": "bytec_1 // 0x151f7c75", "defined_out": [ "0x151f7c75", "tmp%29#0" @@ -1065,14 +1250,14 @@ "0x151f7c75" ] }, - "407": { + "453": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%29#0" ] }, - "408": { + "454": { "op": "concat", "defined_out": [ "tmp%30#0" @@ -1081,11 +1266,11 @@ "tmp%30#0" ] }, - "409": { + "455": { "op": "log", "stack_out": [] }, - "410": { + "456": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1094,11 +1279,11 @@ "tmp%0#0" ] }, - "411": { + "457": { "op": "return", "stack_out": [] }, - "412": { + "458": { "block": "main_remove_label_route@7", "stack_in": [], "op": "txn OnCompletion", @@ -1109,7 +1294,7 @@ "tmp%17#0" ] }, - "414": { + "460": { "op": "!", "defined_out": [ "tmp%18#0" @@ -1118,12 +1303,12 @@ "tmp%18#0" ] }, - "415": { + "461": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "416": { + "462": { "op": "txn ApplicationID", "defined_out": [ "tmp%19#0" @@ -1132,12 +1317,12 @@ "tmp%19#0" ] }, - "418": { + "464": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "419": { + "465": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%21#0" @@ -1146,7 +1331,7 @@ "tmp%21#0" ] }, - "422": { + "468": { "op": "extract 2 0", "defined_out": [ "tmp%22#0" @@ -1155,12 +1340,12 @@ "tmp%22#0" ] }, - "425": { + "471": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "op": "callsub remove_label", "stack_out": [] }, - "428": { + "474": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1169,11 +1354,11 @@ "tmp%0#0" ] }, - "429": { + "475": { "op": "return", "stack_out": [] }, - "430": { + "476": { "block": "main_add_label_route@6", "stack_in": [], "op": "txn OnCompletion", @@ -1184,7 +1369,7 @@ "tmp%9#0" ] }, - "432": { + "478": { "op": "!", "defined_out": [ "tmp%10#0" @@ -1193,12 +1378,12 @@ "tmp%10#0" ] }, - "433": { + "479": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "434": { + "480": { "op": "txn ApplicationID", "defined_out": [ "tmp%11#0" @@ -1207,12 +1392,12 @@ "tmp%11#0" ] }, - "436": { + "482": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "437": { + "483": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%13#0" @@ -1221,7 +1406,7 @@ "tmp%13#0" ] }, - "440": { + "486": { "op": "extract 2 0", "defined_out": [ "tmp%14#0" @@ -1230,7 +1415,7 @@ "tmp%14#0" ] }, - "443": { + "489": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%14#0", @@ -1241,7 +1426,7 @@ "tmp%15#0" ] }, - "446": { + "492": { "op": "extract 2 0", "defined_out": [ "tmp%14#0", @@ -1252,12 +1437,12 @@ "tmp%16#0" ] }, - "449": { + "495": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", "op": "callsub add_label", "stack_out": [] }, - "452": { + "498": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1266,11 +1451,11 @@ "tmp%0#0" ] }, - "453": { + "499": { "op": "return", "stack_out": [] }, - "454": { + "500": { "block": "main_change_admin_route@5", "stack_in": [], "op": "txn OnCompletion", @@ -1281,7 +1466,7 @@ "tmp%3#0" ] }, - "456": { + "502": { "op": "!", "defined_out": [ "tmp%4#0" @@ -1290,12 +1475,12 @@ "tmp%4#0" ] }, - "457": { + "503": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "458": { + "504": { "op": "txn ApplicationID", "defined_out": [ "tmp%5#0" @@ -1304,12 +1489,12 @@ "tmp%5#0" ] }, - "460": { + "506": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "461": { + "507": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%0#0" @@ -1318,7 +1503,7 @@ "reinterpret_bytes[1]%0#0" ] }, - "464": { + "510": { "op": "btoi", "defined_out": [ "tmp%7#0" @@ -1327,7 +1512,7 @@ "tmp%7#0" ] }, - "465": { + "511": { "op": "txnas Accounts", "defined_out": [ "tmp%8#0" @@ -1336,12 +1521,12 @@ "tmp%8#0" ] }, - "467": { + "513": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", "op": "callsub change_admin", "stack_out": [] }, - "470": { + "516": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1350,49 +1535,49 @@ "tmp%0#0" ] }, - "471": { + "517": { "op": "return", "stack_out": [] }, - "472": { - "block": "main_bare_routing@17", + "518": { + "block": "main_bare_routing@19", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%91#0" + "tmp%103#0" ], "stack_out": [ - "tmp%91#0" + "tmp%103#0" ] }, - "474": { - "op": "bnz main_after_if_else@19", + "520": { + "op": "bnz main_after_if_else@21", "stack_out": [] }, - "477": { + "523": { "op": "txn ApplicationID", "defined_out": [ - "tmp%92#0" + "tmp%104#0" ], "stack_out": [ - "tmp%92#0" + "tmp%104#0" ] }, - "479": { + "525": { "op": "!", "defined_out": [ - "tmp%93#0" + "tmp%105#0" ], "stack_out": [ - "tmp%93#0" + "tmp%105#0" ] }, - "480": { + "526": { "error": "can only call when creating", "op": "assert // can only call when creating", "stack_out": [] }, - "481": { + "527": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1401,11 +1586,11 @@ "tmp%0#0" ] }, - "482": { + "528": { "op": "return", "stack_out": [] }, - "483": { + "529": { "subroutine": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "params": { "array#0": "bytes", @@ -1416,7 +1601,7 @@ "stack_in": [], "op": "proto 3 1" }, - "486": { + "532": { "op": "frame_dig -3", "defined_out": [ "array#0 (copy)" @@ -1425,7 +1610,7 @@ "array#0 (copy)" ] }, - "488": { + "534": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -1436,7 +1621,7 @@ "0" ] }, - "489": { + "535": { "op": "extract_uint16", "defined_out": [ "array_length#0" @@ -1445,7 +1630,7 @@ "array_length#0" ] }, - "490": { + "536": { "op": "dup", "defined_out": [ "array_length#0", @@ -1456,7 +1641,7 @@ "array_length#0 (copy)" ] }, - "491": { + "537": { "op": "frame_dig -1", "defined_out": [ "array_length#0", @@ -1469,7 +1654,7 @@ "new_items_count#0 (copy)" ] }, - "493": { + "539": { "op": "+", "defined_out": [ "array_length#0", @@ -1480,14 +1665,14 @@ "new_length#0" ] }, - "494": { + "540": { "op": "swap", "stack_out": [ "new_length#0", "array_length#0" ] }, - "495": { + "541": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -1500,7 +1685,7 @@ "2" ] }, - "496": { + "542": { "op": "*", "defined_out": [ "new_length#0", @@ -1511,7 +1696,7 @@ "tmp%0#0" ] }, - "497": { + "543": { "op": "intc_2 // 2", "stack_out": [ "new_length#0", @@ -1519,7 +1704,7 @@ "2" ] }, - "498": { + "544": { "op": "+", "defined_out": [ "header_end#0", @@ -1530,7 +1715,7 @@ "header_end#0" ] }, - "499": { + "545": { "op": "dig 1", "defined_out": [ "header_end#0", @@ -1543,7 +1728,7 @@ "new_length#0 (copy)" ] }, - "501": { + "547": { "op": "itob", "defined_out": [ "header_end#0", @@ -1556,7 +1741,7 @@ "tmp%1#0" ] }, - "502": { + "548": { "op": "extract 6 2", "defined_out": [ "header_end#0", @@ -1569,7 +1754,7 @@ "tmp%2#0" ] }, - "505": { + "551": { "op": "cover 2", "defined_out": [ "header_end#0", @@ -1582,7 +1767,7 @@ "header_end#0" ] }, - "507": { + "553": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1591,7 +1776,7 @@ "array#0 (copy)" ] }, - "509": { + "555": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1601,7 +1786,7 @@ "2" ] }, - "510": { + "556": { "op": "dig 2", "defined_out": [ "2", @@ -1620,7 +1805,7 @@ "header_end#0 (copy)" ] }, - "512": { + "558": { "op": "substring3", "defined_out": [ "header_end#0", @@ -1635,7 +1820,7 @@ "tmp%3#0" ] }, - "513": { + "559": { "op": "frame_dig -1", "stack_out": [ "tmp%2#0", @@ -1645,7 +1830,7 @@ "new_items_count#0 (copy)" ] }, - "515": { + "561": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1656,7 +1841,7 @@ "2" ] }, - "516": { + "562": { "op": "*", "defined_out": [ "header_end#0", @@ -1673,7 +1858,7 @@ "tmp%4#0" ] }, - "517": { + "563": { "op": "bzero", "defined_out": [ "header_end#0", @@ -1690,7 +1875,7 @@ "tmp%5#0" ] }, - "518": { + "564": { "op": "concat", "defined_out": [ "header_end#0", @@ -1705,7 +1890,7 @@ "tmp%6#0" ] }, - "519": { + "565": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1715,7 +1900,7 @@ "array#0 (copy)" ] }, - "521": { + "567": { "op": "len", "defined_out": [ "header_end#0", @@ -1732,7 +1917,7 @@ "tmp%7#0" ] }, - "522": { + "568": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -1743,7 +1928,7 @@ "array#0 (copy)" ] }, - "524": { + "570": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -1754,7 +1939,7 @@ "header_end#0" ] }, - "526": { + "572": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -1765,7 +1950,7 @@ "tmp%7#0" ] }, - "528": { + "574": { "op": "substring3", "defined_out": [ "new_length#0", @@ -1780,7 +1965,7 @@ "tmp%8#0" ] }, - "529": { + "575": { "op": "concat", "defined_out": [ "new_length#0", @@ -1793,7 +1978,7 @@ "tmp%9#0" ] }, - "530": { + "576": { "op": "frame_dig -2", "defined_out": [ "new_items_bytes#0 (copy)", @@ -1808,7 +1993,7 @@ "new_items_bytes#0 (copy)" ] }, - "532": { + "578": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -1821,7 +2006,7 @@ "array_head_and_tail#0" ] }, - "533": { + "579": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -1834,7 +2019,7 @@ "new_length#0" ] }, - "534": { + "580": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -1843,7 +2028,7 @@ "2" ] }, - "535": { + "581": { "op": "*", "defined_out": [ "array_head_and_tail#0", @@ -1856,7 +2041,7 @@ "tail_offset#0" ] }, - "536": { + "582": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -1870,7 +2055,7 @@ "tail_offset#0" ] }, - "537": { + "583": { "op": "intc_1 // 0", "defined_out": [ "array_head_and_tail#0", @@ -1886,7 +2071,7 @@ "head_offset#0" ] }, - "538": { + "584": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -1903,7 +2088,7 @@ "tail_offset#1" ] }, - "539": { + "585": { "block": "dynamic_array_concat_byte_length_head_for_header@2", "stack_in": [ "tmp%2#0", @@ -1925,7 +2110,7 @@ "head_offset#0" ] }, - "541": { + "587": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -1941,7 +2126,7 @@ "tail_offset#0" ] }, - "543": { + "589": { "op": "<", "defined_out": [ "continue_looping%0#0", @@ -1957,7 +2142,7 @@ "continue_looping%0#0" ] }, - "544": { + "590": { "op": "bz dynamic_array_concat_byte_length_head_after_for@5", "stack_out": [ "tmp%2#0", @@ -1967,7 +2152,7 @@ "tail_offset#1" ] }, - "547": { + "593": { "op": "frame_dig 4", "defined_out": [ "head_offset#0", @@ -1983,7 +2168,7 @@ "tail_offset#1" ] }, - "549": { + "595": { "op": "dup", "defined_out": [ "head_offset#0", @@ -2001,7 +2186,7 @@ "tail_offset#1 (copy)" ] }, - "550": { + "596": { "op": "itob", "defined_out": [ "head_offset#0", @@ -2019,7 +2204,7 @@ "tmp%5#0" ] }, - "551": { + "597": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -2037,7 +2222,7 @@ "tail_offset_bytes#0" ] }, - "554": { + "600": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -2057,7 +2242,7 @@ "array_head_and_tail#0" ] }, - "556": { + "602": { "op": "frame_dig 3", "stack_out": [ "tmp%2#0", @@ -2071,7 +2256,7 @@ "head_offset#0" ] }, - "558": { + "604": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -2094,7 +2279,7 @@ "head_offset#0 (copy)" ] }, - "559": { + "605": { "op": "cover 4", "stack_out": [ "tmp%2#0", @@ -2109,7 +2294,7 @@ "head_offset#0 (copy)" ] }, - "561": { + "607": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -2124,7 +2309,7 @@ "tail_offset_bytes#0" ] }, - "563": { + "609": { "op": "replace3", "stack_out": [ "tmp%2#0", @@ -2137,7 +2322,7 @@ "array_head_and_tail#0" ] }, - "564": { + "610": { "op": "dup", "stack_out": [ "tmp%2#0", @@ -2151,7 +2336,7 @@ "array_head_and_tail#0" ] }, - "565": { + "611": { "op": "frame_bury 1", "defined_out": [ "array_head_and_tail#0", @@ -2170,7 +2355,7 @@ "array_head_and_tail#0" ] }, - "567": { + "613": { "op": "dig 1", "stack_out": [ "tmp%2#0", @@ -2184,7 +2369,7 @@ "tail_offset#1 (copy)" ] }, - "569": { + "615": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail#0", @@ -2204,7 +2389,7 @@ "tmp%6#1" ] }, - "570": { + "616": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2226,7 +2411,7 @@ "2" ] }, - "571": { + "617": { "op": "+", "defined_out": [ "array_head_and_tail#0", @@ -2246,7 +2431,7 @@ "tmp%7#0" ] }, - "572": { + "618": { "op": "+", "stack_out": [ "tmp%2#0", @@ -2258,7 +2443,7 @@ "tail_offset#1" ] }, - "573": { + "619": { "op": "frame_bury 4", "defined_out": [ "array_head_and_tail#0", @@ -2275,7 +2460,7 @@ "head_offset#0" ] }, - "575": { + "621": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -2287,7 +2472,7 @@ "2" ] }, - "576": { + "622": { "op": "+", "stack_out": [ "tmp%2#0", @@ -2298,7 +2483,7 @@ "head_offset#0" ] }, - "577": { + "623": { "op": "frame_bury 3", "stack_out": [ "tmp%2#0", @@ -2308,10 +2493,10 @@ "tail_offset#1" ] }, - "579": { + "625": { "op": "b dynamic_array_concat_byte_length_head_for_header@2" }, - "582": { + "628": { "block": "dynamic_array_concat_byte_length_head_after_for@5", "stack_in": [ "tmp%2#0", @@ -2333,7 +2518,7 @@ "tmp%2#0" ] }, - "584": { + "630": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -2349,7 +2534,7 @@ "array_head_and_tail#0" ] }, - "586": { + "632": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -2365,14 +2550,14 @@ "tmp%12#0" ] }, - "587": { + "633": { "op": "frame_bury 0" }, - "589": { + "635": { "retsub": true, "op": "retsub" }, - "590": { + "636": { "subroutine": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", "params": { "array_items_count#0": "uint64", @@ -2384,19 +2569,19 @@ "stack_in": [], "op": "proto 4 1" }, - "593": { - "op": "bytec_1 // \"\"", + "639": { + "op": "bytec_2 // \"\"", "stack_out": [ "item_offset_adjustment#2" ] }, - "594": { + "640": { "op": "dup" }, - "595": { + "641": { "op": "frame_dig -2" }, - "597": { + "643": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2410,7 +2595,7 @@ "2" ] }, - "598": { + "644": { "op": "*", "defined_out": [ "item_offset_adjustment#0", @@ -2422,7 +2607,7 @@ "item_offset_adjustment#0" ] }, - "599": { + "645": { "op": "frame_dig -4", "defined_out": [ "array_items_count#0 (copy)", @@ -2436,7 +2621,7 @@ "array_items_count#0 (copy)" ] }, - "601": { + "647": { "op": "intc_2 // 2", "stack_out": [ "item_offset_adjustment#2", @@ -2446,7 +2631,7 @@ "2" ] }, - "602": { + "648": { "op": "*", "defined_out": [ "item_offset_adjustment#0", @@ -2460,7 +2645,7 @@ "tmp%0#0" ] }, - "603": { + "649": { "op": "intc_1 // 0", "defined_out": [ "head_offset#0", @@ -2476,7 +2661,7 @@ "head_offset#0" ] }, - "604": { + "650": { "block": "dynamic_array_concat_dynamic_element_for_header@1", "stack_in": [ "item_offset_adjustment#2", @@ -2498,7 +2683,7 @@ "head_offset#0" ] }, - "606": { + "652": { "op": "frame_dig 3", "defined_out": [ "head_offset#0", @@ -2514,7 +2699,7 @@ "tmp%0#0" ] }, - "608": { + "654": { "op": "<", "defined_out": [ "continue_looping%0#0", @@ -2530,7 +2715,7 @@ "continue_looping%0#0" ] }, - "609": { + "655": { "op": "bz dynamic_array_concat_dynamic_element_after_for@4", "stack_out": [ "item_offset_adjustment#2", @@ -2540,7 +2725,7 @@ "head_offset#0" ] }, - "612": { + "658": { "op": "frame_dig -3", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -2556,7 +2741,7 @@ "array_head_and_tail#0 (copy)" ] }, - "614": { + "660": { "op": "frame_dig 4", "stack_out": [ "item_offset_adjustment#2", @@ -2568,7 +2753,7 @@ "head_offset#0" ] }, - "616": { + "662": { "op": "dup", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -2587,7 +2772,7 @@ "head_offset#0 (copy)" ] }, - "617": { + "663": { "op": "cover 2", "stack_out": [ "item_offset_adjustment#2", @@ -2600,7 +2785,7 @@ "head_offset#0 (copy)" ] }, - "619": { + "665": { "op": "extract_uint16", "defined_out": [ "head_offset#0", @@ -2617,7 +2802,7 @@ "item_offset#0" ] }, - "620": { + "666": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -2636,7 +2821,7 @@ "item_offset_adjustment#0" ] }, - "622": { + "668": { "op": "+", "defined_out": [ "head_offset#0", @@ -2654,7 +2839,7 @@ "tmp%1#0" ] }, - "623": { + "669": { "op": "itob", "defined_out": [ "head_offset#0", @@ -2672,7 +2857,7 @@ "tmp%2#0" ] }, - "624": { + "670": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -2690,7 +2875,7 @@ "tmp%3#0" ] }, - "627": { + "673": { "op": "frame_dig 1", "defined_out": [ "head_offset#0", @@ -2710,7 +2895,7 @@ "new_head#0" ] }, - "629": { + "675": { "op": "swap", "stack_out": [ "item_offset_adjustment#2", @@ -2723,7 +2908,7 @@ "tmp%3#0" ] }, - "630": { + "676": { "op": "concat", "stack_out": [ "item_offset_adjustment#2", @@ -2735,7 +2920,7 @@ "new_head#0" ] }, - "631": { + "677": { "op": "frame_bury 1", "defined_out": [ "head_offset#0", @@ -2752,7 +2937,7 @@ "head_offset#0" ] }, - "633": { + "679": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2771,7 +2956,7 @@ "2" ] }, - "634": { + "680": { "op": "+", "stack_out": [ "item_offset_adjustment#2", @@ -2782,7 +2967,7 @@ "head_offset#0" ] }, - "635": { + "681": { "op": "frame_bury 4", "defined_out": [ "head_offset#0", @@ -2798,10 +2983,10 @@ "head_offset#0" ] }, - "637": { + "683": { "op": "b dynamic_array_concat_dynamic_element_for_header@1" }, - "640": { + "686": { "block": "dynamic_array_concat_dynamic_element_after_for@4", "stack_in": [ "item_offset_adjustment#2", @@ -2823,7 +3008,7 @@ "array_head_and_tail#0 (copy)" ] }, - "642": { + "688": { "op": "len", "defined_out": [ "item_offset_adjustment#2" @@ -2837,7 +3022,7 @@ "item_offset_adjustment#2" ] }, - "643": { + "689": { "op": "frame_bury 0", "defined_out": [ "item_offset_adjustment#2" @@ -2850,7 +3035,7 @@ "head_offset#0" ] }, - "645": { + "691": { "op": "intc_1 // 0", "defined_out": [ "head_offset#0", @@ -2865,7 +3050,7 @@ "head_offset#0" ] }, - "646": { + "692": { "op": "frame_bury 4", "defined_out": [ "head_offset#0", @@ -2879,7 +3064,7 @@ "head_offset#0" ] }, - "648": { + "694": { "block": "dynamic_array_concat_dynamic_element_for_header@5", "stack_in": [ "item_offset_adjustment#2", @@ -2901,7 +3086,7 @@ "head_offset#0" ] }, - "650": { + "696": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -2917,7 +3102,7 @@ "item_offset_adjustment#0" ] }, - "652": { + "698": { "op": "<", "defined_out": [ "continue_looping%1#0", @@ -2933,7 +3118,7 @@ "continue_looping%1#0" ] }, - "653": { + "699": { "op": "bz dynamic_array_concat_dynamic_element_after_for@8", "stack_out": [ "item_offset_adjustment#2", @@ -2943,7 +3128,7 @@ "head_offset#0" ] }, - "656": { + "702": { "op": "frame_dig -1", "defined_out": [ "head_offset#0", @@ -2959,7 +3144,7 @@ "new_head_and_tail#0 (copy)" ] }, - "658": { + "704": { "op": "frame_dig 4", "stack_out": [ "item_offset_adjustment#2", @@ -2971,7 +3156,7 @@ "head_offset#0" ] }, - "660": { + "706": { "op": "dup", "defined_out": [ "head_offset#0", @@ -2990,7 +3175,7 @@ "head_offset#0 (copy)" ] }, - "661": { + "707": { "op": "cover 2", "stack_out": [ "item_offset_adjustment#2", @@ -3003,7 +3188,7 @@ "head_offset#0 (copy)" ] }, - "663": { + "709": { "op": "extract_uint16", "defined_out": [ "head_offset#0", @@ -3020,7 +3205,7 @@ "item_offset#0" ] }, - "664": { + "710": { "op": "frame_dig 0", "defined_out": [ "head_offset#0", @@ -3039,7 +3224,7 @@ "item_offset_adjustment#2" ] }, - "666": { + "712": { "op": "+", "defined_out": [ "head_offset#0", @@ -3057,7 +3242,7 @@ "tmp%5#0" ] }, - "667": { + "713": { "op": "itob", "defined_out": [ "head_offset#0", @@ -3075,7 +3260,7 @@ "tmp%6#0" ] }, - "668": { + "714": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -3093,7 +3278,7 @@ "tmp%7#0" ] }, - "671": { + "717": { "op": "frame_dig 1", "defined_out": [ "head_offset#0", @@ -3113,7 +3298,7 @@ "new_head#0" ] }, - "673": { + "719": { "op": "swap", "stack_out": [ "item_offset_adjustment#2", @@ -3126,7 +3311,7 @@ "tmp%7#0" ] }, - "674": { + "720": { "op": "concat", "stack_out": [ "item_offset_adjustment#2", @@ -3138,7 +3323,7 @@ "new_head#0" ] }, - "675": { + "721": { "op": "frame_bury 1", "defined_out": [ "head_offset#0", @@ -3155,7 +3340,7 @@ "head_offset#0" ] }, - "677": { + "723": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -3174,7 +3359,7 @@ "2" ] }, - "678": { + "724": { "op": "+", "stack_out": [ "item_offset_adjustment#2", @@ -3185,7 +3370,7 @@ "head_offset#0" ] }, - "679": { + "725": { "op": "frame_bury 4", "defined_out": [ "head_offset#0", @@ -3201,10 +3386,10 @@ "head_offset#0" ] }, - "681": { + "727": { "op": "b dynamic_array_concat_dynamic_element_for_header@5" }, - "684": { + "730": { "block": "dynamic_array_concat_dynamic_element_after_for@8", "stack_in": [ "item_offset_adjustment#2", @@ -3226,7 +3411,7 @@ "array_items_count#0 (copy)" ] }, - "686": { + "732": { "op": "frame_dig -2", "defined_out": [ "array_items_count#0 (copy)", @@ -3242,7 +3427,7 @@ "new_items_count#0 (copy)" ] }, - "688": { + "734": { "op": "+", "defined_out": [ "tmp%8#0" @@ -3256,7 +3441,7 @@ "tmp%8#0" ] }, - "689": { + "735": { "op": "itob", "defined_out": [ "tmp%9#0" @@ -3270,7 +3455,7 @@ "tmp%9#0" ] }, - "690": { + "736": { "op": "extract 6 2", "defined_out": [ "tmp%10#0" @@ -3284,7 +3469,7 @@ "tmp%10#0" ] }, - "693": { + "739": { "op": "frame_dig 1", "defined_out": [ "new_head#0", @@ -3300,7 +3485,7 @@ "new_head#0" ] }, - "695": { + "741": { "op": "concat", "defined_out": [ "new_head#0", @@ -3315,7 +3500,7 @@ "tmp%11#0" ] }, - "696": { + "742": { "op": "frame_dig -3", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -3332,7 +3517,7 @@ "array_head_and_tail#0 (copy)" ] }, - "698": { + "744": { "op": "frame_dig 3", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -3351,7 +3536,7 @@ "tmp%0#0" ] }, - "700": { + "746": { "op": "frame_dig 0", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -3372,7 +3557,7 @@ "item_offset_adjustment#2" ] }, - "702": { + "748": { "op": "substring3", "defined_out": [ "item_offset_adjustment#2", @@ -3391,7 +3576,7 @@ "tmp%14#0" ] }, - "703": { + "749": { "op": "concat", "defined_out": [ "item_offset_adjustment#2", @@ -3408,7 +3593,7 @@ "tmp%15#0" ] }, - "704": { + "750": { "op": "frame_dig -1", "defined_out": [ "item_offset_adjustment#2", @@ -3427,7 +3612,7 @@ "new_head_and_tail#0 (copy)" ] }, - "706": { + "752": { "op": "len", "defined_out": [ "item_offset_adjustment#2", @@ -3446,7 +3631,7 @@ "tmp%17#0" ] }, - "707": { + "753": { "op": "frame_dig -1", "stack_out": [ "item_offset_adjustment#2", @@ -3459,7 +3644,7 @@ "new_head_and_tail#0 (copy)" ] }, - "709": { + "755": { "op": "frame_dig 2", "defined_out": [ "item_offset_adjustment#0", @@ -3482,7 +3667,7 @@ "item_offset_adjustment#0" ] }, - "711": { + "757": { "op": "uncover 2", "stack_out": [ "item_offset_adjustment#2", @@ -3496,7 +3681,7 @@ "tmp%17#0" ] }, - "713": { + "759": { "op": "substring3", "defined_out": [ "item_offset_adjustment#0", @@ -3516,7 +3701,7 @@ "tmp%18#0" ] }, - "714": { + "760": { "op": "concat", "defined_out": [ "item_offset_adjustment#0", @@ -3534,14 +3719,14 @@ "tmp%19#0" ] }, - "715": { + "761": { "op": "frame_bury 0" }, - "717": { + "763": { "retsub": true, "op": "retsub" }, - "718": { + "764": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "params": {}, "block": "admin_only", @@ -3554,7 +3739,7 @@ "tmp%0#0" ] }, - "720": { + "766": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -3565,8 +3750,8 @@ "0" ] }, - "721": { - "op": "bytec_3 // \"admin\"", + "767": { + "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"", "0", @@ -3578,7 +3763,7 @@ "\"admin\"" ] }, - "722": { + "769": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -3591,7 +3776,7 @@ "maybe_exists%0#0" ] }, - "723": { + "770": { "error": "check self.admin exists", "op": "assert // check self.admin exists", "stack_out": [ @@ -3599,7 +3784,7 @@ "maybe_value%0#0" ] }, - "724": { + "771": { "op": "==", "defined_out": [ "cond#0" @@ -3608,11 +3793,11 @@ "cond#0" ] }, - "725": { + "772": { "op": "bnz admin_only_after_if_else@3", "stack_out": [] }, - "728": { + "775": { "op": "bytec 7 // \"ERR:UNAUTH\"", "defined_out": [ "\"ERR:UNAUTH\"" @@ -3621,20 +3806,20 @@ "\"ERR:UNAUTH\"" ] }, - "730": { + "777": { "op": "log", "stack_out": [] }, - "731": { + "778": { "op": "err" }, - "732": { + "779": { "block": "admin_only_after_if_else@3", "stack_in": [], "retsub": true, "op": "retsub" }, - "733": { + "780": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", "params": { "new_admin#0": "bytes" @@ -3643,12 +3828,12 @@ "stack_in": [], "op": "proto 1 0" }, - "736": { + "783": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "739": { - "op": "bytec_3 // \"admin\"", + "786": { + "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"" ], @@ -3656,7 +3841,7 @@ "\"admin\"" ] }, - "740": { + "788": { "op": "frame_dig -1", "defined_out": [ "\"admin\"", @@ -3667,15 +3852,15 @@ "new_admin#0 (copy)" ] }, - "742": { + "790": { "op": "app_global_put", "stack_out": [] }, - "743": { + "791": { "retsub": true, "op": "retsub" }, - "744": { + "792": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", "params": { "id#0": "bytes", @@ -3685,11 +3870,11 @@ "stack_in": [], "op": "proto 2 0" }, - "747": { + "795": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "750": { + "798": { "op": "frame_dig -2", "defined_out": [ "id#0 (copy)" @@ -3698,7 +3883,7 @@ "id#0 (copy)" ] }, - "752": { + "800": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -3709,17 +3894,17 @@ "maybe_exists%0#0" ] }, - "753": { + "801": { "op": "bury 1", "stack_out": [ "maybe_exists%0#0" ] }, - "755": { + "803": { "op": "bz add_label_after_if_else@3", "stack_out": [] }, - "758": { + "806": { "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -3728,14 +3913,14 @@ "\"ERR:EXISTS\"" ] }, - "760": { + "808": { "op": "log", "stack_out": [] }, - "761": { + "809": { "op": "err" }, - "762": { + "810": { "block": "add_label_after_if_else@3", "stack_in": [], "op": "frame_dig -2", @@ -3746,7 +3931,7 @@ "id#0 (copy)" ] }, - "764": { + "812": { "op": "len", "defined_out": [ "tmp%2#0" @@ -3755,7 +3940,7 @@ "tmp%2#0" ] }, - "765": { + "813": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -3766,7 +3951,7 @@ "2" ] }, - "766": { + "814": { "op": "==", "defined_out": [ "cond#1" @@ -3775,11 +3960,11 @@ "cond#1" ] }, - "767": { + "815": { "op": "bnz add_label_after_if_else@7", "stack_out": [] }, - "770": { + "818": { "op": "bytec 8 // \"ERR:LENGTH\"", "defined_out": [ "\"ERR:LENGTH\"" @@ -3788,14 +3973,14 @@ "\"ERR:LENGTH\"" ] }, - "772": { + "820": { "op": "log", "stack_out": [] }, - "773": { + "821": { "op": "err" }, - "774": { + "822": { "block": "add_label_after_if_else@7", "stack_in": [], "op": "frame_dig -1", @@ -3806,7 +3991,7 @@ "name#0 (copy)" ] }, - "776": { + "824": { "op": "len", "defined_out": [ "length%0#0" @@ -3815,7 +4000,7 @@ "length%0#0" ] }, - "777": { + "825": { "op": "itob", "defined_out": [ "as_bytes%0#0" @@ -3824,7 +4009,7 @@ "as_bytes%0#0" ] }, - "778": { + "826": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0" @@ -3833,14 +4018,14 @@ "length_uint16%0#0" ] }, - "781": { + "829": { "op": "frame_dig -1", "stack_out": [ "length_uint16%0#0", "name#0 (copy)" ] }, - "783": { + "831": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -3849,7 +4034,7 @@ "encoded_value%0#0" ] }, - "784": { + "832": { "op": "pushbytes 0x001200000000000000000000000000000000", "defined_out": [ "0x001200000000000000000000000000000000", @@ -3860,14 +4045,14 @@ "0x001200000000000000000000000000000000" ] }, - "804": { + "852": { "op": "swap", "stack_out": [ "0x001200000000000000000000000000000000", "encoded_value%0#0" ] }, - "805": { + "853": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%4#0" @@ -3876,7 +4061,7 @@ "encoded_tuple_buffer%4#0" ] }, - "806": { + "854": { "op": "frame_dig -2", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -3887,7 +4072,7 @@ "id#0 (copy)" ] }, - "808": { + "856": { "op": "box_del", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -3898,35 +4083,35 @@ "{box_del}" ] }, - "809": { + "857": { "op": "pop", "stack_out": [ "encoded_tuple_buffer%4#0" ] }, - "810": { + "858": { "op": "frame_dig -2", "stack_out": [ "encoded_tuple_buffer%4#0", "id#0 (copy)" ] }, - "812": { + "860": { "op": "swap", "stack_out": [ "id#0 (copy)", "encoded_tuple_buffer%4#0" ] }, - "813": { + "861": { "op": "box_put", "stack_out": [] }, - "814": { + "862": { "retsub": true, "op": "retsub" }, - "815": { + "863": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "params": { "id#0": "bytes" @@ -3935,11 +4120,11 @@ "stack_in": [], "op": "proto 1 0" }, - "818": { + "866": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "821": { + "869": { "op": "frame_dig -1", "defined_out": [ "id#0 (copy)" @@ -3948,7 +4133,7 @@ "id#0 (copy)" ] }, - "823": { + "871": { "op": "box_len", "defined_out": [ "cond#0", @@ -3959,17 +4144,17 @@ "cond#0" ] }, - "824": { + "872": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "826": { + "874": { "op": "bnz remove_label_after_if_else@3", "stack_out": [] }, - "829": { + "877": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -3978,14 +4163,14 @@ "\"ERR:NOEXIST\"" ] }, - "830": { + "878": { "op": "log", "stack_out": [] }, - "831": { + "879": { "op": "err" }, - "832": { + "880": { "block": "remove_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -3996,7 +4181,7 @@ "id#0 (copy)" ] }, - "834": { + "882": { "op": "len", "defined_out": [ "tmp%1#0" @@ -4005,7 +4190,7 @@ "tmp%1#0" ] }, - "835": { + "883": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -4016,7 +4201,7 @@ "2" ] }, - "836": { + "884": { "op": "==", "defined_out": [ "cond#0" @@ -4025,11 +4210,11 @@ "cond#0" ] }, - "837": { + "885": { "op": "bnz remove_label_after_if_else@7", "stack_out": [] }, - "840": { + "888": { "op": "bytec 8 // \"ERR:LENGTH\"", "defined_out": [ "\"ERR:LENGTH\"" @@ -4038,14 +4223,14 @@ "\"ERR:LENGTH\"" ] }, - "842": { + "890": { "op": "log", "stack_out": [] }, - "843": { + "891": { "op": "err" }, - "844": { + "892": { "block": "remove_label_after_if_else@7", "stack_in": [], "op": "frame_dig -1", @@ -4056,7 +4241,7 @@ "id#0 (copy)" ] }, - "846": { + "894": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -4067,14 +4252,14 @@ "maybe_exists%1#0" ] }, - "847": { + "895": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "848": { + "896": { "error": "Index access is out of bounds", "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ @@ -4084,7 +4269,7 @@ "reinterpret_biguint%0#0" ] }, - "851": { + "899": { "op": "bytec 9 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", @@ -4095,7 +4280,7 @@ "0x0000000000000000" ] }, - "853": { + "901": { "op": "b==", "defined_out": [ "cond#0" @@ -4104,11 +4289,11 @@ "cond#0" ] }, - "854": { + "902": { "op": "bnz remove_label_after_if_else@11", "stack_out": [] }, - "857": { + "905": { "op": "bytec 10 // \"ERR:NOEMPTY\"", "defined_out": [ "\"ERR:NOEMPTY\"" @@ -4117,14 +4302,14 @@ "\"ERR:NOEMPTY\"" ] }, - "859": { + "907": { "op": "log", "stack_out": [] }, - "860": { + "908": { "op": "err" }, - "861": { + "909": { "block": "remove_label_after_if_else@11", "stack_in": [], "op": "frame_dig -1", @@ -4135,7 +4320,7 @@ "id#0 (copy)" ] }, - "863": { + "911": { "op": "box_del", "defined_out": [ "{box_del}" @@ -4144,15 +4329,15 @@ "{box_del}" ] }, - "864": { + "912": { "op": "pop", "stack_out": [] }, - "865": { + "913": { "retsub": true, "op": "retsub" }, - "866": { + "914": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "params": { "id#0": "bytes" @@ -4161,7 +4346,7 @@ "stack_in": [], "op": "proto 1 1" }, - "869": { + "917": { "op": "frame_dig -1", "defined_out": [ "id#0 (copy)" @@ -4170,7 +4355,7 @@ "id#0 (copy)" ] }, - "871": { + "919": { "op": "box_len", "defined_out": [ "cond#0", @@ -4181,17 +4366,17 @@ "cond#0" ] }, - "872": { + "920": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "874": { + "922": { "op": "bnz get_label_after_if_else@3", "stack_out": [] }, - "877": { + "925": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -4200,14 +4385,14 @@ "\"ERR:NOEXIST\"" ] }, - "878": { + "926": { "op": "log", "stack_out": [] }, - "879": { + "927": { "op": "err" }, - "880": { + "928": { "block": "get_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -4218,7 +4403,7 @@ "id#0 (copy)" ] }, - "882": { + "930": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -4229,18 +4414,18 @@ "maybe_exists%1#0" ] }, - "883": { + "931": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "884": { + "932": { "retsub": true, "op": "retsub" }, - "885": { + "933": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", "params": { "ids#0": "bytes" @@ -4249,7 +4434,7 @@ "stack_in": [], "op": "proto 1 0" }, - "888": { + "936": { "op": "frame_dig -1", "defined_out": [ "ids#0 (copy)" @@ -4258,7 +4443,7 @@ "ids#0 (copy)" ] }, - "890": { + "938": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -4269,7 +4454,7 @@ "0" ] }, - "891": { + "939": { "op": "extract_uint16", "defined_out": [ "array_length%0#0" @@ -4278,7 +4463,7 @@ "array_length%0#0" ] }, - "892": { + "940": { "op": "intc_1 // 0", "defined_out": [ "_idx#0", @@ -4289,7 +4474,7 @@ "_idx#0" ] }, - "893": { + "941": { "block": "log_labels_for_header@1", "stack_in": [ "array_length%0#0", @@ -4305,7 +4490,7 @@ "_idx#0" ] }, - "895": { + "943": { "op": "frame_dig 0", "defined_out": [ "_idx#0", @@ -4318,7 +4503,7 @@ "array_length%0#0" ] }, - "897": { + "945": { "op": "<", "defined_out": [ "_idx#0", @@ -4331,14 +4516,14 @@ "continue_looping%0#0" ] }, - "898": { + "946": { "op": "bz log_labels_after_for@4", "stack_out": [ "array_length%0#0", "_idx#0" ] }, - "901": { + "949": { "op": "frame_dig -1", "defined_out": [ "_idx#0", @@ -4351,7 +4536,7 @@ "ids#0 (copy)" ] }, - "903": { + "951": { "op": "extract 2 0", "defined_out": [ "_idx#0", @@ -4364,7 +4549,7 @@ "array_head_and_tail%0#0" ] }, - "906": { + "954": { "op": "frame_dig 1", "stack_out": [ "array_length%0#0", @@ -4373,7 +4558,7 @@ "_idx#0" ] }, - "908": { + "956": { "op": "dup", "defined_out": [ "_idx#0", @@ -4389,7 +4574,7 @@ "_idx#0 (copy)" ] }, - "909": { + "957": { "op": "cover 2", "stack_out": [ "array_length%0#0", @@ -4399,7 +4584,7 @@ "_idx#0 (copy)" ] }, - "911": { + "959": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -4417,7 +4602,7 @@ "2" ] }, - "912": { + "960": { "op": "*", "defined_out": [ "_idx#0", @@ -4433,7 +4618,7 @@ "item_offset_offset%0#0" ] }, - "913": { + "961": { "op": "dig 1", "defined_out": [ "_idx#0", @@ -4451,7 +4636,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "915": { + "963": { "op": "swap", "stack_out": [ "array_length%0#0", @@ -4462,7 +4647,7 @@ "item_offset_offset%0#0" ] }, - "916": { + "964": { "op": "extract_uint16", "defined_out": [ "_idx#0", @@ -4478,7 +4663,7 @@ "item_offset%0#0" ] }, - "917": { + "965": { "op": "dup2", "defined_out": [ "_idx#0", @@ -4498,7 +4683,7 @@ "item_offset%0#0 (copy)" ] }, - "918": { + "966": { "op": "extract_uint16", "defined_out": [ "_idx#0", @@ -4516,7 +4701,7 @@ "item_length%0#0" ] }, - "919": { + "967": { "op": "intc_2 // 2", "stack_out": [ "array_length%0#0", @@ -4528,7 +4713,7 @@ "2" ] }, - "920": { + "968": { "op": "+", "defined_out": [ "_idx#0", @@ -4546,7 +4731,7 @@ "item_head_tail_length%0#0" ] }, - "921": { + "969": { "op": "extract3", "defined_out": [ "_idx#0", @@ -4560,7 +4745,7 @@ "label_id#0" ] }, - "922": { + "970": { "op": "extract 2 0", "defined_out": [ "_idx#0", @@ -4574,7 +4759,7 @@ "tmp%0#0" ] }, - "925": { + "973": { "op": "box_get", "defined_out": [ "_idx#0", @@ -4590,7 +4775,7 @@ "maybe_exists%0#0" ] }, - "926": { + "974": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -4600,7 +4785,7 @@ "maybe_value%0#0" ] }, - "927": { + "975": { "op": "log", "stack_out": [ "array_length%0#0", @@ -4608,7 +4793,7 @@ "_idx#0" ] }, - "928": { + "976": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -4622,7 +4807,7 @@ "1" ] }, - "929": { + "977": { "op": "+", "stack_out": [ "array_length%0#0", @@ -4630,7 +4815,7 @@ "_idx#0" ] }, - "930": { + "978": { "op": "frame_bury 1", "defined_out": [ "_idx#0", @@ -4641,10 +4826,10 @@ "_idx#0" ] }, - "932": { + "980": { "op": "b log_labels_for_header@1" }, - "935": { + "983": { "block": "log_labels_after_for@4", "stack_in": [ "array_length%0#0", @@ -4653,7 +4838,7 @@ "retsub": true, "op": "retsub" }, - "936": { + "984": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "params": { "label#0": "bytes" @@ -4662,7 +4847,7 @@ "stack_in": [], "op": "proto 1 0" }, - "939": { + "987": { "op": "txn Sender", "defined_out": [ "tmp%0#0" @@ -4671,7 +4856,7 @@ "tmp%0#0" ] }, - "941": { + "989": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -4682,8 +4867,8 @@ "0" ] }, - "942": { - "op": "bytec_3 // \"admin\"", + "990": { + "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"", "0", @@ -4695,7 +4880,7 @@ "\"admin\"" ] }, - "943": { + "992": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -4708,7 +4893,7 @@ "maybe_exists%0#0" ] }, - "944": { + "993": { "error": "check self.admin exists", "op": "assert // check self.admin exists", "stack_out": [ @@ -4716,7 +4901,7 @@ "maybe_value%0#0" ] }, - "945": { + "994": { "op": "==", "defined_out": [ "tmp%1#0" @@ -4725,15 +4910,15 @@ "tmp%1#0" ] }, - "946": { + "995": { "op": "bz admin_or_operator_only_after_if_else@2", "stack_out": [] }, - "949": { + "998": { "retsub": true, "op": "retsub" }, - "950": { + "999": { "block": "admin_or_operator_only_after_if_else@2", "stack_in": [], "op": "frame_dig -1", @@ -4744,16 +4929,16 @@ "label#0 (copy)" ] }, - "952": { + "1001": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [] }, - "955": { + "1004": { "retsub": true, "op": "retsub" }, - "956": { + "1005": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "params": { "label#0": "bytes" @@ -4762,7 +4947,7 @@ "stack_in": [], "op": "proto 1 0" }, - "959": { + "1008": { "op": "txn Sender", "defined_out": [ "tmp%0#0" @@ -4771,7 +4956,7 @@ "tmp%0#0" ] }, - "961": { + "1010": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -4782,7 +4967,7 @@ "label#0 (copy)" ] }, - "963": { + "1012": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -4792,7 +4977,7 @@ "tmp%1#0" ] }, - "966": { + "1015": { "op": "intc 4 // 4294967296", "defined_out": [ "4294967296", @@ -4803,7 +4988,7 @@ "4294967296" ] }, - "968": { + "1017": { "op": "!=", "defined_out": [ "tmp%2#0" @@ -4812,11 +4997,11 @@ "tmp%2#0" ] }, - "969": { + "1018": { "op": "bz operator_only_bool_false@3", "stack_out": [] }, - "972": { + "1021": { "op": "txn Sender", "defined_out": [ "tmp%3#0" @@ -4825,14 +5010,14 @@ "tmp%3#0" ] }, - "974": { + "1023": { "op": "frame_dig -1", "stack_out": [ "tmp%3#0", "label#0 (copy)" ] }, - "976": { + "1025": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -4842,7 +5027,7 @@ "tmp%4#0" ] }, - "979": { + "1028": { "op": "intc_3 // 4294967295", "defined_out": [ "4294967295", @@ -4853,7 +5038,7 @@ "4294967295" ] }, - "980": { + "1029": { "op": "!=", "defined_out": [ "tmp%5#0" @@ -4862,11 +5047,11 @@ "tmp%5#0" ] }, - "981": { + "1030": { "op": "bz operator_only_bool_false@3", "stack_out": [] }, - "984": { + "1033": { "op": "intc_0 // 1", "defined_out": [ "cond#0" @@ -4875,7 +5060,7 @@ "cond#0" ] }, - "985": { + "1034": { "block": "operator_only_bool_merge@4", "stack_in": [ "cond#0" @@ -4884,7 +5069,7 @@ "defined_out": [], "stack_out": [] }, - "988": { + "1037": { "op": "bytec 7 // \"ERR:UNAUTH\"", "defined_out": [ "\"ERR:UNAUTH\"" @@ -4893,20 +5078,20 @@ "\"ERR:UNAUTH\"" ] }, - "990": { + "1039": { "op": "log", "stack_out": [] }, - "991": { + "1040": { "op": "err" }, - "992": { + "1041": { "block": "operator_only_after_if_else@7", "stack_in": [], "retsub": true, "op": "retsub" }, - "993": { + "1042": { "block": "operator_only_bool_false@3", "stack_in": [], "op": "intc_1 // 0", @@ -4917,10 +5102,10 @@ "cond#0" ] }, - "994": { + "1043": { "op": "b operator_only_bool_merge@4" }, - "997": { + "1046": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "params": { "operator#0": "bytes", @@ -4930,20 +5115,20 @@ "stack_in": [], "op": "proto 2 1" }, - "1000": { + "1049": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#0" ] }, - "1001": { - "op": "bytec_1 // \"\"", + "1050": { + "op": "bytec_2 // \"\"", "stack_out": [ "maybe_value%1#0", "array_length%0#0" ] }, - "1002": { + "1051": { "op": "dup", "stack_out": [ "maybe_value%1#0", @@ -4951,7 +5136,7 @@ "idx#0" ] }, - "1003": { + "1052": { "op": "frame_dig -2", "defined_out": [ "operator#0 (copy)" @@ -4963,7 +5148,7 @@ "operator#0 (copy)" ] }, - "1005": { + "1054": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -4977,7 +5162,7 @@ "maybe_exists%0#0" ] }, - "1006": { + "1055": { "op": "bury 1", "stack_out": [ "maybe_value%1#0", @@ -4986,7 +5171,7 @@ "maybe_exists%0#0" ] }, - "1008": { + "1057": { "op": "bnz get_operator_label_index_after_if_else@2", "stack_out": [ "maybe_value%1#0", @@ -4994,7 +5179,7 @@ "idx#0" ] }, - "1011": { + "1060": { "op": "intc 4 // 4294967296", "defined_out": [ "4294967296" @@ -5006,14 +5191,14 @@ "4294967296" ] }, - "1013": { + "1062": { "op": "frame_bury 0" }, - "1015": { + "1064": { "retsub": true, "op": "retsub" }, - "1016": { + "1065": { "block": "get_operator_label_index_after_if_else@2", "stack_in": [ "maybe_value%1#0", @@ -5031,7 +5216,7 @@ "operator#0 (copy)" ] }, - "1018": { + "1067": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -5045,7 +5230,7 @@ "maybe_exists%1#0" ] }, - "1019": { + "1068": { "op": "swap", "stack_out": [ "maybe_value%1#0", @@ -5055,7 +5240,7 @@ "maybe_value%1#0" ] }, - "1020": { + "1069": { "op": "dup", "stack_out": [ "maybe_value%1#0", @@ -5066,7 +5251,7 @@ "maybe_value%1#0 (copy)" ] }, - "1021": { + "1070": { "op": "cover 2", "stack_out": [ "maybe_value%1#0", @@ -5077,7 +5262,7 @@ "maybe_value%1#0" ] }, - "1023": { + "1072": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%1#0", @@ -5091,7 +5276,7 @@ "maybe_exists%1#0" ] }, - "1025": { + "1074": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -5101,7 +5286,7 @@ "maybe_value%1#0" ] }, - "1026": { + "1075": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#0", @@ -5111,7 +5296,7 @@ "0" ] }, - "1027": { + "1076": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -5124,7 +5309,7 @@ "array_length%0#0" ] }, - "1028": { + "1077": { "op": "frame_bury 1", "defined_out": [ "array_length%0#0", @@ -5136,7 +5321,7 @@ "idx#0" ] }, - "1030": { + "1079": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -5150,7 +5335,7 @@ "idx#0" ] }, - "1031": { + "1080": { "op": "frame_bury 2", "defined_out": [ "array_length%0#0", @@ -5163,7 +5348,7 @@ "idx#0" ] }, - "1033": { + "1082": { "block": "get_operator_label_index_for_header@3", "stack_in": [ "maybe_value%1#0", @@ -5181,7 +5366,7 @@ "idx#0" ] }, - "1035": { + "1084": { "op": "frame_dig 1", "defined_out": [ "array_length%0#0", @@ -5195,7 +5380,7 @@ "array_length%0#0" ] }, - "1037": { + "1086": { "op": "<", "defined_out": [ "array_length%0#0", @@ -5209,7 +5394,7 @@ "continue_looping%0#0" ] }, - "1038": { + "1087": { "op": "bz get_operator_label_index_after_for@8", "stack_out": [ "maybe_value%1#0", @@ -5217,7 +5402,7 @@ "idx#0" ] }, - "1041": { + "1090": { "op": "frame_dig 0", "defined_out": [ "array_length%0#0", @@ -5231,7 +5416,7 @@ "maybe_value%1#0" ] }, - "1043": { + "1092": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -5246,7 +5431,7 @@ "array_head_and_tail%0#0" ] }, - "1046": { + "1095": { "op": "frame_dig 2", "stack_out": [ "maybe_value%1#0", @@ -5256,7 +5441,7 @@ "idx#0" ] }, - "1048": { + "1097": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -5274,7 +5459,7 @@ "2" ] }, - "1049": { + "1098": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -5291,7 +5476,7 @@ "item_offset_offset%0#0" ] }, - "1050": { + "1099": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -5310,7 +5495,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1052": { + "1101": { "op": "swap", "stack_out": [ "maybe_value%1#0", @@ -5321,7 +5506,7 @@ "item_offset_offset%0#0" ] }, - "1053": { + "1102": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -5338,7 +5523,7 @@ "item_offset%0#0" ] }, - "1054": { + "1103": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -5359,7 +5544,7 @@ "item_offset%0#0 (copy)" ] }, - "1055": { + "1104": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -5378,7 +5563,7 @@ "item_length%0#0" ] }, - "1056": { + "1105": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%1#0", @@ -5390,7 +5575,7 @@ "2" ] }, - "1057": { + "1106": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -5409,7 +5594,7 @@ "item_head_tail_length%0#0" ] }, - "1058": { + "1107": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -5424,7 +5609,7 @@ "stored_label#0" ] }, - "1059": { + "1108": { "op": "extract 2 0", "defined_out": [ "array_length%0#0", @@ -5439,7 +5624,7 @@ "tmp%2#0" ] }, - "1062": { + "1111": { "op": "frame_dig -1", "defined_out": [ "array_length%0#0", @@ -5456,7 +5641,7 @@ "label#0 (copy)" ] }, - "1064": { + "1113": { "op": "==", "defined_out": [ "array_length%0#0", @@ -5471,7 +5656,7 @@ "tmp%3#0" ] }, - "1065": { + "1114": { "op": "bz get_operator_label_index_after_if_else@6", "stack_out": [ "maybe_value%1#0", @@ -5479,7 +5664,7 @@ "idx#0" ] }, - "1068": { + "1117": { "op": "frame_dig 2", "stack_out": [ "maybe_value%1#0", @@ -5488,14 +5673,14 @@ "idx#0" ] }, - "1070": { + "1119": { "op": "frame_bury 0" }, - "1072": { + "1121": { "retsub": true, "op": "retsub" }, - "1073": { + "1122": { "block": "get_operator_label_index_after_if_else@6", "stack_in": [ "maybe_value%1#0", @@ -5513,7 +5698,7 @@ "idx#0" ] }, - "1075": { + "1124": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -5527,7 +5712,7 @@ "1" ] }, - "1076": { + "1125": { "op": "+", "stack_out": [ "maybe_value%1#0", @@ -5536,7 +5721,7 @@ "idx#0" ] }, - "1077": { + "1126": { "op": "frame_bury 2", "defined_out": [ "idx#0" @@ -5547,10 +5732,10 @@ "idx#0" ] }, - "1079": { + "1128": { "op": "b get_operator_label_index_for_header@3" }, - "1082": { + "1131": { "block": "get_operator_label_index_after_for@8", "stack_in": [ "maybe_value%1#0", @@ -5568,14 +5753,14 @@ "4294967295" ] }, - "1083": { + "1132": { "op": "frame_bury 0" }, - "1085": { + "1134": { "retsub": true, "op": "retsub" }, - "1086": { + "1135": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", "params": { "operator#0": "bytes", @@ -5585,7 +5770,7 @@ "stack_in": [], "op": "proto 2 0" }, - "1089": { + "1138": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)" @@ -5594,18 +5779,18 @@ "label#0 (copy)" ] }, - "1091": { + "1140": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "op": "callsub admin_or_operator_only", "stack_out": [] }, - "1094": { + "1143": { "op": "frame_dig -1", "stack_out": [ "label#0 (copy)" ] }, - "1096": { + "1145": { "op": "box_len", "defined_out": [ "cond#0", @@ -5616,17 +5801,17 @@ "cond#0" ] }, - "1097": { + "1146": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "1099": { + "1148": { "op": "bnz add_operator_to_label_after_if_else@10", "stack_out": [] }, - "1102": { + "1151": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -5635,14 +5820,14 @@ "\"ERR:NOEXIST\"" ] }, - "1103": { + "1152": { "op": "log", "stack_out": [] }, - "1104": { + "1153": { "op": "err" }, - "1105": { + "1154": { "block": "add_operator_to_label_after_if_else@10", "stack_in": [], "op": "frame_dig -2", @@ -5653,7 +5838,7 @@ "operator#0 (copy)" ] }, - "1107": { + "1156": { "op": "box_len", "defined_out": [ "maybe_exists%1#0", @@ -5664,23 +5849,23 @@ "maybe_exists%1#0" ] }, - "1108": { + "1157": { "op": "bury 1", "stack_out": [ "maybe_exists%1#0" ] }, - "1110": { + "1159": { "op": "bz add_operator_to_label_else_body@2", "stack_out": [] }, - "1113": { + "1162": { "op": "frame_dig -2", "stack_out": [ "operator#0 (copy)" ] }, - "1115": { + "1164": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -5691,7 +5876,7 @@ "label#0 (copy)" ] }, - "1117": { + "1166": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -5701,7 +5886,7 @@ "tmp%2#0" ] }, - "1120": { + "1169": { "op": "intc_3 // 4294967295", "defined_out": [ "4294967295", @@ -5712,7 +5897,7 @@ "4294967295" ] }, - "1121": { + "1170": { "op": "==", "defined_out": [ "cond#0" @@ -5721,11 +5906,11 @@ "cond#0" ] }, - "1122": { + "1171": { "op": "bnz add_operator_to_label_after_if_else@6", "stack_out": [] }, - "1125": { + "1174": { "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -5734,14 +5919,14 @@ "\"ERR:EXISTS\"" ] }, - "1127": { + "1176": { "op": "log", "stack_out": [] }, - "1128": { + "1177": { "op": "err" }, - "1129": { + "1178": { "block": "add_operator_to_label_after_if_else@6", "stack_in": [], "op": "frame_dig -2", @@ -5752,7 +5937,7 @@ "operator#0 (copy)" ] }, - "1131": { + "1180": { "op": "box_get", "defined_out": [ "existing#0", @@ -5763,14 +5948,14 @@ "maybe_exists%2#0" ] }, - "1132": { + "1181": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ "existing#0" ] }, - "1133": { + "1182": { "op": "frame_dig -1", "defined_out": [ "existing#0", @@ -5781,7 +5966,7 @@ "label#0 (copy)" ] }, - "1135": { + "1184": { "op": "len", "defined_out": [ "existing#0", @@ -5792,7 +5977,7 @@ "length%0#0" ] }, - "1136": { + "1185": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -5803,7 +5988,7 @@ "as_bytes%0#0" ] }, - "1137": { + "1186": { "op": "extract 6 2", "defined_out": [ "existing#0", @@ -5814,7 +5999,7 @@ "length_uint16%0#0" ] }, - "1140": { + "1189": { "op": "frame_dig -1", "stack_out": [ "existing#0", @@ -5822,7 +6007,7 @@ "label#0 (copy)" ] }, - "1142": { + "1191": { "op": "concat", "defined_out": [ "encoded_value%0#0", @@ -5833,7 +6018,7 @@ "encoded_value%0#0" ] }, - "1143": { + "1192": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -5846,21 +6031,21 @@ "1" ] }, - "1144": { + "1193": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ "existing#0" ] }, - "1147": { + "1196": { "op": "frame_dig -2", "stack_out": [ "existing#0", "operator#0 (copy)" ] }, - "1149": { + "1198": { "op": "box_del", "defined_out": [ "existing#0", @@ -5871,31 +6056,31 @@ "{box_del}" ] }, - "1150": { + "1199": { "op": "pop", "stack_out": [ "existing#0" ] }, - "1151": { + "1200": { "op": "frame_dig -2", "stack_out": [ "existing#0", "operator#0 (copy)" ] }, - "1153": { + "1202": { "op": "swap", "stack_out": [ "operator#0 (copy)", "existing#0" ] }, - "1154": { + "1203": { "op": "box_put", "stack_out": [] }, - "1155": { + "1204": { "block": "add_operator_to_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -5906,7 +6091,7 @@ "label#0 (copy)" ] }, - "1157": { + "1206": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -5917,14 +6102,14 @@ "maybe_exists%3#0" ] }, - "1158": { + "1207": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "label_descriptor#0" ] }, - "1159": { + "1208": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -5935,7 +6120,7 @@ "label_descriptor#0 (copy)" ] }, - "1160": { + "1209": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -5948,7 +6133,7 @@ "10" ] }, - "1162": { + "1211": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -5959,7 +6144,7 @@ "tmp%9#0" ] }, - "1163": { + "1212": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -5972,7 +6157,7 @@ "1" ] }, - "1164": { + "1213": { "op": "+", "defined_out": [ "label_descriptor#0", @@ -5983,7 +6168,7 @@ "to_encode%0#0" ] }, - "1165": { + "1214": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -5994,20 +6179,20 @@ "val_as_bytes%0#0" ] }, - "1166": { + "1215": { "op": "replace2 10", "stack_out": [ "label_descriptor#0" ] }, - "1168": { + "1217": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "label#0 (copy)" ] }, - "1170": { + "1219": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -6018,35 +6203,35 @@ "{box_del}" ] }, - "1171": { + "1220": { "op": "pop", "stack_out": [ "label_descriptor#0" ] }, - "1172": { + "1221": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "label#0 (copy)" ] }, - "1174": { + "1223": { "op": "swap", "stack_out": [ "label#0 (copy)", "label_descriptor#0" ] }, - "1175": { + "1224": { "op": "box_put", "stack_out": [] }, - "1176": { + "1225": { "retsub": true, "op": "retsub" }, - "1177": { + "1226": { "block": "add_operator_to_label_else_body@2", "stack_in": [], "op": "frame_dig -1", @@ -6057,7 +6242,7 @@ "label#0 (copy)" ] }, - "1179": { + "1228": { "op": "len", "defined_out": [ "length%1#0" @@ -6066,7 +6251,7 @@ "length%1#0" ] }, - "1180": { + "1229": { "op": "itob", "defined_out": [ "as_bytes%1#0" @@ -6075,7 +6260,7 @@ "as_bytes%1#0" ] }, - "1181": { + "1230": { "op": "extract 6 2", "defined_out": [ "length_uint16%1#0" @@ -6084,14 +6269,14 @@ "length_uint16%1#0" ] }, - "1184": { + "1233": { "op": "frame_dig -1", "stack_out": [ "length_uint16%1#0", "label#0 (copy)" ] }, - "1186": { + "1235": { "op": "concat", "defined_out": [ "encoded_value%1#0" @@ -6100,7 +6285,7 @@ "encoded_value%1#0" ] }, - "1187": { + "1236": { "op": "bytec 6 // 0x0002", "defined_out": [ "0x0002", @@ -6111,14 +6296,14 @@ "0x0002" ] }, - "1189": { + "1238": { "op": "swap", "stack_out": [ "0x0002", "encoded_value%1#0" ] }, - "1190": { + "1239": { "op": "concat", "defined_out": [ "result%1#0" @@ -6127,7 +6312,7 @@ "result%1#0" ] }, - "1191": { + "1240": { "op": "bytec 11 // 0x0001", "defined_out": [ "0x0001", @@ -6138,14 +6323,14 @@ "0x0001" ] }, - "1193": { + "1242": { "op": "swap", "stack_out": [ "0x0001", "result%1#0" ] }, - "1194": { + "1243": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -6154,7 +6339,7 @@ "array_data%0#0" ] }, - "1195": { + "1244": { "op": "frame_dig -2", "defined_out": [ "array_data%0#0", @@ -6165,7 +6350,7 @@ "operator#0 (copy)" ] }, - "1197": { + "1246": { "op": "box_del", "defined_out": [ "array_data%0#0", @@ -6176,34 +6361,34 @@ "{box_del}" ] }, - "1198": { + "1247": { "op": "pop", "stack_out": [ "array_data%0#0" ] }, - "1199": { + "1248": { "op": "frame_dig -2", "stack_out": [ "array_data%0#0", "operator#0 (copy)" ] }, - "1201": { + "1250": { "op": "swap", "stack_out": [ "operator#0 (copy)", "array_data%0#0" ] }, - "1202": { + "1251": { "op": "box_put", "stack_out": [] }, - "1203": { + "1252": { "op": "b add_operator_to_label_after_if_else@3" }, - "1206": { + "1255": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", "params": { "operator#0": "bytes", @@ -6213,13 +6398,13 @@ "stack_in": [], "op": "proto 2 0" }, - "1209": { + "1258": { "op": "intc_1 // 0", "stack_out": [ "label_descriptor#0" ] }, - "1210": { + "1259": { "op": "dupn 4", "stack_out": [ "label_descriptor#0", @@ -6229,8 +6414,8 @@ "stored_label#0" ] }, - "1212": { - "op": "bytec_1 // \"\"", + "1261": { + "op": "bytec_2 // \"\"", "stack_out": [ "label_descriptor#0", "maybe_value%4#0", @@ -6240,7 +6425,7 @@ "array_length%0#0" ] }, - "1213": { + "1262": { "op": "dupn 2", "stack_out": [ "label_descriptor#0", @@ -6253,7 +6438,7 @@ "label_idx#0" ] }, - "1215": { + "1264": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)" @@ -6270,7 +6455,7 @@ "label#0 (copy)" ] }, - "1217": { + "1266": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "op": "callsub admin_or_operator_only", "stack_out": [ @@ -6284,7 +6469,7 @@ "label_idx#0" ] }, - "1220": { + "1269": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", @@ -6298,7 +6483,7 @@ "label#0 (copy)" ] }, - "1222": { + "1271": { "op": "box_len", "defined_out": [ "cond#0", @@ -6317,7 +6502,7 @@ "cond#0" ] }, - "1223": { + "1272": { "op": "bury 1", "stack_out": [ "label_descriptor#0", @@ -6331,7 +6516,7 @@ "cond#0" ] }, - "1225": { + "1274": { "op": "bnz remove_operator_from_label_after_if_else@28", "stack_out": [ "label_descriptor#0", @@ -6344,7 +6529,7 @@ "label_idx#0" ] }, - "1228": { + "1277": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -6361,7 +6546,7 @@ "\"ERR:NOEXIST\"" ] }, - "1229": { + "1278": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -6374,10 +6559,10 @@ "label_idx#0" ] }, - "1230": { + "1279": { "op": "err" }, - "1231": { + "1280": { "block": "remove_operator_from_label_after_if_else@28", "stack_in": [ "label_descriptor#0", @@ -6405,7 +6590,7 @@ "operator#0 (copy)" ] }, - "1233": { + "1282": { "op": "box_len", "defined_out": [ "cond#0", @@ -6424,7 +6609,7 @@ "cond#0" ] }, - "1234": { + "1283": { "op": "bury 1", "stack_out": [ "label_descriptor#0", @@ -6438,7 +6623,7 @@ "cond#0" ] }, - "1236": { + "1285": { "op": "bnz remove_operator_from_label_after_if_else@32", "stack_out": [ "label_descriptor#0", @@ -6451,7 +6636,7 @@ "label_idx#0" ] }, - "1239": { + "1288": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -6468,7 +6653,7 @@ "\"ERR:NOEXIST\"" ] }, - "1240": { + "1289": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -6481,10 +6666,10 @@ "label_idx#0" ] }, - "1241": { + "1290": { "op": "err" }, - "1242": { + "1291": { "block": "remove_operator_from_label_after_if_else@32", "stack_in": [ "label_descriptor#0", @@ -6512,7 +6697,7 @@ "operator#0 (copy)" ] }, - "1244": { + "1293": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -6531,7 +6716,7 @@ "label#0 (copy)" ] }, - "1246": { + "1295": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -6549,7 +6734,7 @@ "label_idx#0" ] }, - "1249": { + "1298": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -6564,7 +6749,7 @@ "label_idx#0" ] }, - "1250": { + "1299": { "op": "frame_bury 7", "defined_out": [ "label_idx#0" @@ -6581,7 +6766,7 @@ "label_idx#0" ] }, - "1252": { + "1301": { "op": "intc_3 // 4294967295", "defined_out": [ "4294967295", @@ -6600,7 +6785,7 @@ "4294967295" ] }, - "1253": { + "1302": { "op": "!=", "defined_out": [ "label_idx#0", @@ -6618,7 +6803,7 @@ "tmp%2#0" ] }, - "1254": { + "1303": { "op": "bz remove_operator_from_label_bool_false@3", "stack_out": [ "label_descriptor#0", @@ -6631,7 +6816,7 @@ "label_idx#0" ] }, - "1257": { + "1306": { "op": "frame_dig 7", "stack_out": [ "label_descriptor#0", @@ -6645,7 +6830,7 @@ "label_idx#0" ] }, - "1259": { + "1308": { "op": "intc 4 // 4294967296", "defined_out": [ "4294967296", @@ -6664,7 +6849,7 @@ "4294967296" ] }, - "1261": { + "1310": { "op": "!=", "defined_out": [ "label_idx#0", @@ -6682,7 +6867,7 @@ "tmp%3#0" ] }, - "1262": { + "1311": { "op": "bz remove_operator_from_label_bool_false@3", "stack_out": [ "label_descriptor#0", @@ -6695,7 +6880,7 @@ "label_idx#0" ] }, - "1265": { + "1314": { "op": "intc_0 // 1", "defined_out": [ "cond#0", @@ -6713,7 +6898,7 @@ "cond#0" ] }, - "1266": { + "1315": { "block": "remove_operator_from_label_bool_merge@4", "stack_in": [ "label_descriptor#0", @@ -6739,7 +6924,7 @@ "label_idx#0" ] }, - "1269": { + "1318": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -6756,7 +6941,7 @@ "\"ERR:NOEXIST\"" ] }, - "1270": { + "1319": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -6769,10 +6954,10 @@ "label_idx#0" ] }, - "1271": { + "1320": { "op": "err" }, - "1272": { + "1321": { "block": "remove_operator_from_label_after_if_else@24", "stack_in": [ "label_descriptor#0", @@ -6800,7 +6985,7 @@ "label#0 (copy)" ] }, - "1274": { + "1323": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -6819,7 +7004,7 @@ "maybe_exists%2#0" ] }, - "1275": { + "1324": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -6834,7 +7019,7 @@ "label_descriptor#0" ] }, - "1276": { + "1325": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -6850,7 +7035,7 @@ "label_descriptor#0 (copy)" ] }, - "1277": { + "1326": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -6866,7 +7051,7 @@ "label_descriptor#0" ] }, - "1279": { + "1328": { "op": "frame_bury 0", "defined_out": [ "label_descriptor#0", @@ -6885,7 +7070,7 @@ "maybe_exists%2#0" ] }, - "1281": { + "1330": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -6900,7 +7085,7 @@ "label_descriptor#0" ] }, - "1282": { + "1331": { "error": "Index access is out of bounds", "op": "extract 10 8 // on error: Index access is out of bounds", "defined_out": [ @@ -6919,7 +7104,7 @@ "reinterpret_biguint%0#0" ] }, - "1285": { + "1334": { "op": "pushbytes 0x0000000000000001", "defined_out": [ "0x0000000000000001", @@ -6939,7 +7124,7 @@ "0x0000000000000001" ] }, - "1295": { + "1344": { "op": "b>", "defined_out": [ "label_descriptor#0", @@ -6957,7 +7142,7 @@ "tmp%5#0" ] }, - "1296": { + "1345": { "op": "bnz remove_operator_from_label_bool_true@6", "stack_out": [ "label_descriptor#0", @@ -6970,7 +7155,7 @@ "label_idx#0" ] }, - "1299": { + "1348": { "op": "frame_dig 0", "stack_out": [ "label_descriptor#0", @@ -6984,7 +7169,7 @@ "label_descriptor#0" ] }, - "1301": { + "1350": { "error": "Index access is out of bounds", "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ @@ -7003,7 +7188,7 @@ "reinterpret_biguint%2#0" ] }, - "1304": { + "1353": { "op": "bytec 9 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", @@ -7023,7 +7208,7 @@ "0x0000000000000000" ] }, - "1306": { + "1355": { "op": "b==", "defined_out": [ "label_descriptor#0", @@ -7041,7 +7226,7 @@ "tmp%6#0" ] }, - "1307": { + "1356": { "op": "bz remove_operator_from_label_bool_false@7", "stack_out": [ "label_descriptor#0", @@ -7054,7 +7239,7 @@ "label_idx#0" ] }, - "1310": { + "1359": { "block": "remove_operator_from_label_bool_true@6", "stack_in": [ "label_descriptor#0", @@ -7082,7 +7267,7 @@ "cond#0" ] }, - "1311": { + "1360": { "block": "remove_operator_from_label_bool_merge@8", "stack_in": [ "label_descriptor#0", @@ -7108,7 +7293,7 @@ "label_idx#0" ] }, - "1314": { + "1363": { "op": "bytec 10 // \"ERR:NOEMPTY\"", "defined_out": [ "\"ERR:NOEMPTY\"" @@ -7125,7 +7310,7 @@ "\"ERR:NOEMPTY\"" ] }, - "1316": { + "1365": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -7138,10 +7323,10 @@ "label_idx#0" ] }, - "1317": { + "1366": { "op": "err" }, - "1318": { + "1367": { "block": "remove_operator_from_label_after_if_else@20", "stack_in": [ "label_descriptor#0", @@ -7169,7 +7354,7 @@ "label_descriptor#0" ] }, - "1320": { + "1369": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -7188,7 +7373,7 @@ "label_descriptor#0 (copy)" ] }, - "1321": { + "1370": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -7209,7 +7394,7 @@ "10" ] }, - "1323": { + "1372": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -7228,7 +7413,7 @@ "tmp%8#0" ] }, - "1324": { + "1373": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -7249,7 +7434,7 @@ "1" ] }, - "1325": { + "1374": { "op": "-", "defined_out": [ "label_descriptor#0", @@ -7268,7 +7453,7 @@ "to_encode%0#0" ] }, - "1326": { + "1375": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -7287,7 +7472,7 @@ "val_as_bytes%0#0" ] }, - "1327": { + "1376": { "op": "replace2 10", "stack_out": [ "label_descriptor#0", @@ -7301,7 +7486,7 @@ "label_descriptor#0" ] }, - "1329": { + "1378": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -7320,7 +7505,7 @@ "label#0 (copy)" ] }, - "1331": { + "1380": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -7339,7 +7524,7 @@ "{box_del}" ] }, - "1332": { + "1381": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -7353,7 +7538,7 @@ "label_descriptor#0" ] }, - "1333": { + "1382": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", @@ -7368,7 +7553,7 @@ "label#0 (copy)" ] }, - "1335": { + "1384": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -7383,7 +7568,7 @@ "label_descriptor#0" ] }, - "1336": { + "1385": { "op": "box_put", "stack_out": [ "label_descriptor#0", @@ -7396,7 +7581,7 @@ "label_idx#0" ] }, - "1337": { + "1386": { "op": "frame_dig -2", "defined_out": [ "label_descriptor#0", @@ -7414,7 +7599,7 @@ "operator#0 (copy)" ] }, - "1339": { + "1388": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -7434,7 +7619,7 @@ "maybe_exists%3#0" ] }, - "1340": { + "1389": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -7449,7 +7634,7 @@ "maybe_value%3#0" ] }, - "1341": { + "1390": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -7469,7 +7654,7 @@ "0" ] }, - "1342": { + "1391": { "op": "extract_uint16", "defined_out": [ "label_descriptor#0", @@ -7487,7 +7672,7 @@ "tmp%11#0" ] }, - "1343": { + "1392": { "op": "intc_0 // 1", "stack_out": [ "label_descriptor#0", @@ -7502,7 +7687,7 @@ "1" ] }, - "1344": { + "1393": { "op": "==", "defined_out": [ "label_descriptor#0", @@ -7520,7 +7705,7 @@ "tmp%12#0" ] }, - "1345": { + "1394": { "op": "bz remove_operator_from_label_else_body@10", "stack_out": [ "label_descriptor#0", @@ -7533,7 +7718,7 @@ "label_idx#0" ] }, - "1348": { + "1397": { "op": "frame_dig -2", "stack_out": [ "label_descriptor#0", @@ -7547,7 +7732,7 @@ "operator#0 (copy)" ] }, - "1350": { + "1399": { "op": "box_del", "stack_out": [ "label_descriptor#0", @@ -7561,7 +7746,7 @@ "{box_del}" ] }, - "1351": { + "1400": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -7574,11 +7759,11 @@ "label_idx#0" ] }, - "1352": { + "1401": { "retsub": true, "op": "retsub" }, - "1353": { + "1402": { "block": "remove_operator_from_label_else_body@10", "stack_in": [ "label_descriptor#0", @@ -7590,7 +7775,7 @@ "idx#0", "label_idx#0" ], - "op": "bytec_2 // 0x0000", + "op": "bytec_3 // 0x0000", "defined_out": [ "next_list#0" ], @@ -7606,7 +7791,7 @@ "next_list#0" ] }, - "1354": { + "1403": { "op": "frame_bury 2", "defined_out": [ "next_list#0" @@ -7622,7 +7807,7 @@ "label_idx#0" ] }, - "1356": { + "1405": { "op": "frame_dig -2", "defined_out": [ "next_list#0", @@ -7640,7 +7825,7 @@ "operator#0 (copy)" ] }, - "1358": { + "1407": { "op": "box_get", "defined_out": [ "maybe_exists%4#0", @@ -7660,7 +7845,7 @@ "maybe_exists%4#0" ] }, - "1359": { + "1408": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -7675,7 +7860,7 @@ "maybe_value%4#0" ] }, - "1360": { + "1409": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -7691,7 +7876,7 @@ "maybe_value%4#0 (copy)" ] }, - "1361": { + "1410": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -7707,7 +7892,7 @@ "maybe_value%4#0" ] }, - "1363": { + "1412": { "op": "frame_bury 1", "defined_out": [ "maybe_exists%4#0", @@ -7727,7 +7912,7 @@ "maybe_exists%4#0" ] }, - "1365": { + "1414": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -7742,7 +7927,7 @@ "maybe_value%4#0" ] }, - "1366": { + "1415": { "op": "intc_1 // 0", "stack_out": [ "label_descriptor#0", @@ -7757,7 +7942,7 @@ "0" ] }, - "1367": { + "1416": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -7776,7 +7961,7 @@ "array_length%0#0" ] }, - "1368": { + "1417": { "op": "frame_bury 5", "defined_out": [ "array_length%0#0", @@ -7794,7 +7979,7 @@ "label_idx#0" ] }, - "1370": { + "1419": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -7814,7 +7999,7 @@ "idx#0" ] }, - "1371": { + "1420": { "op": "frame_bury 6", "defined_out": [ "array_length%0#0", @@ -7833,7 +8018,7 @@ "label_idx#0" ] }, - "1373": { + "1422": { "block": "remove_operator_from_label_for_header@11", "stack_in": [ "label_descriptor#0", @@ -7861,7 +8046,7 @@ "idx#0" ] }, - "1375": { + "1424": { "op": "frame_dig 5", "defined_out": [ "array_length%0#0", @@ -7880,7 +8065,7 @@ "array_length%0#0" ] }, - "1377": { + "1426": { "op": "<", "defined_out": [ "array_length%0#0", @@ -7899,7 +8084,7 @@ "continue_looping%0#0" ] }, - "1378": { + "1427": { "op": "bz remove_operator_from_label_after_for@16", "stack_out": [ "label_descriptor#0", @@ -7912,7 +8097,7 @@ "label_idx#0" ] }, - "1381": { + "1430": { "op": "frame_dig 1", "defined_out": [ "array_length%0#0", @@ -7931,7 +8116,7 @@ "maybe_value%4#0" ] }, - "1383": { + "1432": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -7951,7 +8136,7 @@ "array_head_and_tail%0#0" ] }, - "1386": { + "1435": { "op": "frame_dig 6", "stack_out": [ "label_descriptor#0", @@ -7966,7 +8151,7 @@ "idx#0" ] }, - "1388": { + "1437": { "op": "dup", "defined_out": [ "array_head_and_tail%0#0", @@ -7989,7 +8174,7 @@ "idx#0 (copy)" ] }, - "1389": { + "1438": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -8005,7 +8190,7 @@ "idx#0 (copy)" ] }, - "1391": { + "1440": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -8030,7 +8215,7 @@ "2" ] }, - "1392": { + "1441": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -8053,7 +8238,7 @@ "item_offset_offset%0#0" ] }, - "1393": { + "1442": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -8078,7 +8263,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1395": { + "1444": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -8095,7 +8280,7 @@ "item_offset_offset%0#0" ] }, - "1396": { + "1445": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -8118,7 +8303,7 @@ "item_offset%0#0" ] }, - "1397": { + "1446": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -8145,7 +8330,7 @@ "item_offset%0#0 (copy)" ] }, - "1398": { + "1447": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -8170,7 +8355,7 @@ "item_length%0#0" ] }, - "1399": { + "1448": { "op": "intc_2 // 2", "stack_out": [ "label_descriptor#0", @@ -8188,7 +8373,7 @@ "2" ] }, - "1400": { + "1449": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -8213,7 +8398,7 @@ "item_head_tail_length%0#0" ] }, - "1401": { + "1450": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -8234,7 +8419,7 @@ "stored_label#0" ] }, - "1402": { + "1451": { "op": "frame_bury 4", "defined_out": [ "array_length%0#0", @@ -8254,7 +8439,7 @@ "idx#0" ] }, - "1404": { + "1453": { "op": "frame_dig 7", "defined_out": [ "array_length%0#0", @@ -8276,7 +8461,7 @@ "label_idx#0" ] }, - "1406": { + "1455": { "op": "!=", "defined_out": [ "array_length%0#0", @@ -8298,7 +8483,7 @@ "tmp%15#0" ] }, - "1407": { + "1456": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -8322,7 +8507,7 @@ "next_list#9" ] }, - "1409": { + "1458": { "op": "frame_bury 3", "defined_out": [ "array_length%0#0", @@ -8345,7 +8530,7 @@ "tmp%15#0" ] }, - "1411": { + "1460": { "op": "bz remove_operator_from_label_after_if_else@14", "stack_out": [ "label_descriptor#0", @@ -8358,7 +8543,7 @@ "label_idx#0" ] }, - "1414": { + "1463": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -8381,7 +8566,7 @@ "next_list#0" ] }, - "1416": { + "1465": { "op": "frame_dig 4", "stack_out": [ "label_descriptor#0", @@ -8396,7 +8581,7 @@ "stored_label#0" ] }, - "1418": { + "1467": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -8422,7 +8607,7 @@ "1" ] }, - "1419": { + "1468": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -8437,7 +8622,7 @@ "next_list#9" ] }, - "1422": { + "1471": { "op": "frame_bury 3", "stack_out": [ "label_descriptor#0", @@ -8450,7 +8635,7 @@ "label_idx#0" ] }, - "1424": { + "1473": { "block": "remove_operator_from_label_after_if_else@14", "stack_in": [ "label_descriptor#0", @@ -8478,7 +8663,7 @@ "next_list#0" ] }, - "1426": { + "1475": { "op": "frame_bury 2", "defined_out": [ "next_list#0" @@ -8494,7 +8679,7 @@ "label_idx#0" ] }, - "1428": { + "1477": { "op": "frame_dig 6", "defined_out": [ "idx#0", @@ -8512,7 +8697,7 @@ "idx#0" ] }, - "1430": { + "1479": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -8532,7 +8717,7 @@ "1" ] }, - "1431": { + "1480": { "op": "+", "stack_out": [ "label_descriptor#0", @@ -8546,7 +8731,7 @@ "idx#0" ] }, - "1432": { + "1481": { "op": "frame_bury 6", "defined_out": [ "idx#0", @@ -8563,10 +8748,10 @@ "label_idx#0" ] }, - "1434": { + "1483": { "op": "b remove_operator_from_label_for_header@11" }, - "1437": { + "1486": { "block": "remove_operator_from_label_after_for@16", "stack_in": [ "label_descriptor#0", @@ -8594,7 +8779,7 @@ "operator#0 (copy)" ] }, - "1439": { + "1488": { "op": "box_del", "defined_out": [ "{box_del}" @@ -8611,7 +8796,7 @@ "{box_del}" ] }, - "1440": { + "1489": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -8624,7 +8809,7 @@ "label_idx#0" ] }, - "1441": { + "1490": { "op": "frame_dig -2", "stack_out": [ "label_descriptor#0", @@ -8638,7 +8823,7 @@ "operator#0 (copy)" ] }, - "1443": { + "1492": { "op": "frame_dig 2", "defined_out": [ "next_list#0", @@ -8657,7 +8842,7 @@ "next_list#0" ] }, - "1445": { + "1494": { "op": "box_put", "stack_out": [ "label_descriptor#0", @@ -8670,11 +8855,11 @@ "label_idx#0" ] }, - "1446": { + "1495": { "retsub": true, "op": "retsub" }, - "1447": { + "1496": { "block": "remove_operator_from_label_bool_false@7", "stack_in": [ "label_descriptor#0", @@ -8702,10 +8887,10 @@ "cond#0" ] }, - "1448": { + "1497": { "op": "b remove_operator_from_label_bool_merge@8" }, - "1451": { + "1500": { "block": "remove_operator_from_label_bool_false@3", "stack_in": [ "label_descriptor#0", @@ -8733,10 +8918,10 @@ "cond#0" ] }, - "1452": { + "1501": { "op": "b remove_operator_from_label_bool_merge@4" }, - "1455": { + "1504": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", "params": { "operator#0": "bytes" @@ -8745,7 +8930,7 @@ "stack_in": [], "op": "proto 1 1" }, - "1458": { + "1507": { "op": "frame_dig -1", "defined_out": [ "operator#0 (copy)" @@ -8754,7 +8939,7 @@ "operator#0 (copy)" ] }, - "1460": { + "1509": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -8765,23 +8950,23 @@ "maybe_exists%0#0" ] }, - "1461": { + "1510": { "op": "bury 1", "stack_out": [ "maybe_exists%0#0" ] }, - "1463": { + "1512": { "op": "bz get_operator_labels_after_if_else@2", "stack_out": [] }, - "1466": { + "1515": { "op": "frame_dig -1", "stack_out": [ "operator#0 (copy)" ] }, - "1468": { + "1517": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -8792,21 +8977,21 @@ "maybe_exists%1#0" ] }, - "1469": { + "1518": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "1470": { + "1519": { "retsub": true, "op": "retsub" }, - "1471": { + "1520": { "block": "get_operator_labels_after_if_else@2", "stack_in": [], - "op": "bytec_2 // 0x0000", + "op": "bytec_3 // 0x0000", "defined_out": [ "0x0000" ], @@ -8814,11 +8999,11 @@ "0x0000" ] }, - "1472": { + "1521": { "retsub": true, "op": "retsub" }, - "1473": { + "1522": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", "params": { "label#0": "bytes", @@ -8828,28 +9013,28 @@ "stack_in": [], "op": "proto 2 0" }, - "1476": { + "1525": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#1" ] }, - "1477": { + "1526": { "op": "dup", "stack_out": [ "maybe_value%1#1", "tmp%1#0" ] }, - "1478": { - "op": "bytec_1 // \"\"", + "1527": { + "op": "bytec_2 // \"\"", "stack_out": [ "maybe_value%1#1", "tmp%1#0", "array_length%0#0" ] }, - "1479": { + "1528": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -8858,7 +9043,7 @@ "idx#0" ] }, - "1480": { + "1529": { "op": "frame_dig -2", "defined_out": [ "label#0 (copy)" @@ -8871,7 +9056,7 @@ "label#0 (copy)" ] }, - "1482": { + "1531": { "op": "box_len", "defined_out": [ "cond#0", @@ -8886,7 +9071,7 @@ "cond#0" ] }, - "1483": { + "1532": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -8896,7 +9081,7 @@ "cond#0" ] }, - "1485": { + "1534": { "op": "bnz add_label_to_asset_after_if_else@19", "stack_out": [ "maybe_value%1#1", @@ -8905,7 +9090,7 @@ "idx#0" ] }, - "1488": { + "1537": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -8918,7 +9103,7 @@ "\"ERR:NOEXIST\"" ] }, - "1489": { + "1538": { "op": "log", "stack_out": [ "maybe_value%1#1", @@ -8927,10 +9112,10 @@ "idx#0" ] }, - "1490": { + "1539": { "op": "err" }, - "1491": { + "1540": { "block": "add_label_to_asset_after_if_else@19", "stack_in": [ "maybe_value%1#1", @@ -8950,7 +9135,7 @@ "label#0 (copy)" ] }, - "1493": { + "1542": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [ @@ -8960,7 +9145,7 @@ "idx#0" ] }, - "1496": { + "1545": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -8973,7 +9158,7 @@ "asset#0 (copy)" ] }, - "1498": { + "1547": { "op": "itob", "defined_out": [ "tmp%1#0" @@ -8986,7 +9171,7 @@ "tmp%1#0" ] }, - "1499": { + "1548": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -8997,7 +9182,7 @@ "tmp%1#0" ] }, - "1500": { + "1549": { "op": "frame_bury 1", "defined_out": [ "tmp%1#0" @@ -9010,7 +9195,7 @@ "tmp%1#0" ] }, - "1502": { + "1551": { "op": "box_len", "defined_out": [ "maybe_exists%1#0", @@ -9026,7 +9211,7 @@ "maybe_exists%1#0" ] }, - "1503": { + "1552": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -9036,7 +9221,7 @@ "maybe_exists%1#0" ] }, - "1505": { + "1554": { "op": "bz add_label_to_asset_else_body@2", "stack_out": [ "maybe_value%1#1", @@ -9045,7 +9230,7 @@ "idx#0" ] }, - "1508": { + "1557": { "op": "frame_dig 1", "stack_out": [ "maybe_value%1#1", @@ -9055,7 +9240,7 @@ "tmp%1#0" ] }, - "1510": { + "1559": { "op": "box_len", "defined_out": [ "maybe_exists%0#1", @@ -9071,7 +9256,7 @@ "maybe_exists%0#1" ] }, - "1511": { + "1560": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -9081,7 +9266,7 @@ "maybe_exists%0#1" ] }, - "1513": { + "1562": { "op": "bnz add_label_to_asset_after_if_else@6", "stack_out": [ "maybe_value%1#1", @@ -9090,7 +9275,7 @@ "idx#0" ] }, - "1516": { + "1565": { "op": "intc 4 // 4294967296", "defined_out": [ "tmp%1#0", @@ -9104,7 +9289,7 @@ "tmp%3#0" ] }, - "1518": { + "1567": { "block": "add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12", "stack_in": [ "maybe_value%1#1", @@ -9127,7 +9312,7 @@ "4294967295" ] }, - "1519": { + "1568": { "op": "==", "defined_out": [ "cond#0" @@ -9140,7 +9325,7 @@ "cond#0" ] }, - "1520": { + "1569": { "op": "bnz add_label_to_asset_after_if_else@15", "stack_out": [ "maybe_value%1#1", @@ -9149,7 +9334,7 @@ "idx#0" ] }, - "1523": { + "1572": { "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -9162,7 +9347,7 @@ "\"ERR:EXISTS\"" ] }, - "1525": { + "1574": { "op": "log", "stack_out": [ "maybe_value%1#1", @@ -9171,10 +9356,10 @@ "idx#0" ] }, - "1526": { + "1575": { "op": "err" }, - "1527": { + "1576": { "block": "add_label_to_asset_after_if_else@15", "stack_in": [ "maybe_value%1#1", @@ -9194,7 +9379,7 @@ "tmp%1#0" ] }, - "1529": { + "1578": { "op": "dup", "defined_out": [ "tmp%1#0", @@ -9209,7 +9394,7 @@ "tmp%1#0 (copy)" ] }, - "1530": { + "1579": { "op": "box_get", "defined_out": [ "existing#0", @@ -9226,7 +9411,7 @@ "maybe_exists%2#0" ] }, - "1531": { + "1580": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -9238,7 +9423,7 @@ "existing#0" ] }, - "1532": { + "1581": { "op": "frame_dig -2", "defined_out": [ "existing#0", @@ -9255,7 +9440,7 @@ "label#0 (copy)" ] }, - "1534": { + "1583": { "op": "len", "defined_out": [ "existing#0", @@ -9272,7 +9457,7 @@ "length%0#0" ] }, - "1535": { + "1584": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -9289,7 +9474,7 @@ "as_bytes%0#0" ] }, - "1536": { + "1585": { "op": "extract 6 2", "defined_out": [ "existing#0", @@ -9306,7 +9491,7 @@ "length_uint16%0#0" ] }, - "1539": { + "1588": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -9319,7 +9504,7 @@ "label#0 (copy)" ] }, - "1541": { + "1590": { "op": "concat", "defined_out": [ "encoded_value%0#0", @@ -9336,7 +9521,7 @@ "encoded_value%0#0" ] }, - "1542": { + "1591": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -9355,7 +9540,7 @@ "1" ] }, - "1543": { + "1592": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -9367,7 +9552,7 @@ "existing#0" ] }, - "1546": { + "1595": { "op": "dig 1", "stack_out": [ "maybe_value%1#1", @@ -9379,7 +9564,7 @@ "tmp%1#0 (copy)" ] }, - "1548": { + "1597": { "op": "box_del", "defined_out": [ "existing#0", @@ -9396,7 +9581,7 @@ "{box_del}" ] }, - "1549": { + "1598": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -9407,7 +9592,7 @@ "existing#0" ] }, - "1550": { + "1599": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -9416,7 +9601,7 @@ "idx#0" ] }, - "1551": { + "1600": { "block": "add_label_to_asset_after_if_else@3", "stack_in": [ "maybe_value%1#1", @@ -9436,7 +9621,7 @@ "label#0 (copy)" ] }, - "1553": { + "1602": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -9451,7 +9636,7 @@ "maybe_exists%3#0" ] }, - "1554": { + "1603": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -9462,7 +9647,7 @@ "label_descriptor#0" ] }, - "1555": { + "1604": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -9477,7 +9662,7 @@ "label_descriptor#0 (copy)" ] }, - "1556": { + "1605": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -9494,7 +9679,7 @@ "2" ] }, - "1557": { + "1606": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -9509,7 +9694,7 @@ "tmp%13#0" ] }, - "1558": { + "1607": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -9526,7 +9711,7 @@ "1" ] }, - "1559": { + "1608": { "op": "+", "defined_out": [ "label_descriptor#0", @@ -9541,7 +9726,7 @@ "to_encode%0#0" ] }, - "1560": { + "1609": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -9556,7 +9741,7 @@ "val_as_bytes%0#0" ] }, - "1561": { + "1610": { "op": "replace2 2", "stack_out": [ "maybe_value%1#1", @@ -9566,7 +9751,7 @@ "label_descriptor#0" ] }, - "1563": { + "1612": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -9577,7 +9762,7 @@ "label#0 (copy)" ] }, - "1565": { + "1614": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -9592,7 +9777,7 @@ "{box_del}" ] }, - "1566": { + "1615": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -9602,7 +9787,7 @@ "label_descriptor#0" ] }, - "1567": { + "1616": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -9613,7 +9798,7 @@ "label#0 (copy)" ] }, - "1569": { + "1618": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -9624,7 +9809,7 @@ "label_descriptor#0" ] }, - "1570": { + "1619": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -9633,11 +9818,11 @@ "idx#0" ] }, - "1571": { + "1620": { "retsub": true, "op": "retsub" }, - "1572": { + "1621": { "block": "add_label_to_asset_after_if_else@6", "stack_in": [ "maybe_value%1#1", @@ -9657,7 +9842,7 @@ "tmp%1#0" ] }, - "1574": { + "1623": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -9673,7 +9858,7 @@ "maybe_exists%1#0" ] }, - "1575": { + "1624": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -9684,7 +9869,7 @@ "maybe_value%1#1" ] }, - "1576": { + "1625": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -9696,7 +9881,7 @@ "maybe_value%1#1 (copy)" ] }, - "1577": { + "1626": { "op": "cover 2", "stack_out": [ "maybe_value%1#1", @@ -9708,7 +9893,7 @@ "maybe_value%1#1" ] }, - "1579": { + "1628": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%1#0", @@ -9724,7 +9909,7 @@ "maybe_exists%1#0" ] }, - "1581": { + "1630": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -9735,7 +9920,7 @@ "maybe_value%1#1" ] }, - "1582": { + "1631": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -9751,7 +9936,7 @@ "0" ] }, - "1583": { + "1632": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -9766,7 +9951,7 @@ "array_length%0#0" ] }, - "1584": { + "1633": { "op": "frame_bury 2", "defined_out": [ "array_length%0#0", @@ -9780,7 +9965,7 @@ "idx#0" ] }, - "1586": { + "1635": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -9796,7 +9981,7 @@ "idx#0" ] }, - "1587": { + "1636": { "op": "frame_bury 3", "defined_out": [ "array_length%0#0", @@ -9811,7 +9996,7 @@ "idx#0" ] }, - "1589": { + "1638": { "block": "add_label_to_asset_for_header@7", "stack_in": [ "maybe_value%1#1", @@ -9831,7 +10016,7 @@ "idx#0" ] }, - "1591": { + "1640": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -9846,7 +10031,7 @@ "array_length%0#0" ] }, - "1593": { + "1642": { "op": "<", "defined_out": [ "array_length%0#0", @@ -9861,7 +10046,7 @@ "continue_looping%0#0" ] }, - "1594": { + "1643": { "op": "bz add_label_to_asset_after_for@11", "stack_out": [ "maybe_value%1#1", @@ -9870,7 +10055,7 @@ "idx#0" ] }, - "1597": { + "1646": { "op": "frame_dig 0", "defined_out": [ "array_length%0#0", @@ -9885,7 +10070,7 @@ "maybe_value%1#1" ] }, - "1599": { + "1648": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -9901,7 +10086,7 @@ "array_head_and_tail%0#0" ] }, - "1602": { + "1651": { "op": "frame_dig 3", "stack_out": [ "maybe_value%1#1", @@ -9912,7 +10097,7 @@ "idx#0" ] }, - "1604": { + "1653": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -9931,7 +10116,7 @@ "2" ] }, - "1605": { + "1654": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -9949,7 +10134,7 @@ "item_offset_offset%0#0" ] }, - "1606": { + "1655": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -9969,7 +10154,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1608": { + "1657": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -9981,7 +10166,7 @@ "item_offset_offset%0#0" ] }, - "1609": { + "1658": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -9999,7 +10184,7 @@ "item_offset%0#0" ] }, - "1610": { + "1659": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -10021,7 +10206,7 @@ "item_offset%0#0 (copy)" ] }, - "1611": { + "1660": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -10041,7 +10226,7 @@ "item_length%0#0" ] }, - "1612": { + "1661": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%1#1", @@ -10054,7 +10239,7 @@ "2" ] }, - "1613": { + "1662": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -10074,7 +10259,7 @@ "item_head_tail_length%0#0" ] }, - "1614": { + "1663": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -10090,7 +10275,7 @@ "stored_label#0" ] }, - "1615": { + "1664": { "op": "extract 2 0", "defined_out": [ "array_length%0#0", @@ -10106,7 +10291,7 @@ "tmp%4#1" ] }, - "1618": { + "1667": { "op": "frame_dig -2", "defined_out": [ "array_length%0#0", @@ -10124,7 +10309,7 @@ "label#0 (copy)" ] }, - "1620": { + "1669": { "op": "==", "defined_out": [ "array_length%0#0", @@ -10140,7 +10325,7 @@ "tmp%5#1" ] }, - "1621": { + "1670": { "op": "bz add_label_to_asset_after_if_else@10", "stack_out": [ "maybe_value%1#1", @@ -10149,7 +10334,7 @@ "idx#0" ] }, - "1624": { + "1673": { "op": "frame_dig 3", "defined_out": [ "array_length%0#0", @@ -10165,10 +10350,10 @@ "tmp%3#0" ] }, - "1626": { + "1675": { "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" }, - "1629": { + "1678": { "block": "add_label_to_asset_after_if_else@10", "stack_in": [ "maybe_value%1#1", @@ -10188,7 +10373,7 @@ "idx#0" ] }, - "1631": { + "1680": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -10203,7 +10388,7 @@ "1" ] }, - "1632": { + "1681": { "op": "+", "stack_out": [ "maybe_value%1#1", @@ -10213,7 +10398,7 @@ "idx#0" ] }, - "1633": { + "1682": { "op": "frame_bury 3", "defined_out": [ "idx#0" @@ -10225,10 +10410,10 @@ "idx#0" ] }, - "1635": { + "1684": { "op": "b add_label_to_asset_for_header@7" }, - "1638": { + "1687": { "block": "add_label_to_asset_after_for@11", "stack_in": [ "maybe_value%1#1", @@ -10248,10 +10433,10 @@ "tmp%3#0" ] }, - "1639": { + "1688": { "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" }, - "1642": { + "1691": { "block": "add_label_to_asset_else_body@2", "stack_in": [ "maybe_value%1#1", @@ -10271,7 +10456,7 @@ "label#0 (copy)" ] }, - "1644": { + "1693": { "op": "len", "defined_out": [ "length%1#0" @@ -10284,7 +10469,7 @@ "length%1#0" ] }, - "1645": { + "1694": { "op": "itob", "defined_out": [ "as_bytes%1#0" @@ -10297,7 +10482,7 @@ "as_bytes%1#0" ] }, - "1646": { + "1695": { "op": "extract 6 2", "defined_out": [ "length_uint16%1#0" @@ -10310,7 +10495,7 @@ "length_uint16%1#0" ] }, - "1649": { + "1698": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -10321,7 +10506,7 @@ "label#0 (copy)" ] }, - "1651": { + "1700": { "op": "concat", "defined_out": [ "encoded_value%1#0" @@ -10334,7 +10519,7 @@ "encoded_value%1#0" ] }, - "1652": { + "1701": { "op": "bytec 6 // 0x0002", "defined_out": [ "0x0002", @@ -10349,7 +10534,7 @@ "0x0002" ] }, - "1654": { + "1703": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -10360,7 +10545,7 @@ "encoded_value%1#0" ] }, - "1655": { + "1704": { "op": "concat", "defined_out": [ "result%1#0" @@ -10373,7 +10558,7 @@ "result%1#0" ] }, - "1656": { + "1705": { "op": "bytec 11 // 0x0001", "defined_out": [ "0x0001", @@ -10388,7 +10573,7 @@ "0x0001" ] }, - "1658": { + "1707": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -10399,7 +10584,7 @@ "result%1#0" ] }, - "1659": { + "1708": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -10412,7 +10597,7 @@ "array_data%0#0" ] }, - "1660": { + "1709": { "op": "frame_dig 1", "defined_out": [ "array_data%0#0", @@ -10427,7 +10612,7 @@ "tmp%1#0" ] }, - "1662": { + "1711": { "op": "dup", "defined_out": [ "array_data%0#0", @@ -10444,7 +10629,7 @@ "tmp%1#0 (copy)" ] }, - "1663": { + "1712": { "op": "box_del", "defined_out": [ "array_data%0#0", @@ -10461,7 +10646,7 @@ "{box_del}" ] }, - "1664": { + "1713": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -10472,7 +10657,7 @@ "tmp%1#0" ] }, - "1665": { + "1714": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -10483,7 +10668,7 @@ "array_data%0#0" ] }, - "1666": { + "1715": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -10492,10 +10677,10 @@ "idx#0" ] }, - "1667": { + "1716": { "op": "b add_label_to_asset_after_if_else@3" }, - "1670": { + "1719": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", "params": { "label#0": "bytes", @@ -10505,13 +10690,13 @@ "stack_in": [], "op": "proto 2 0" }, - "1673": { + "1722": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0" ] }, - "1674": { + "1723": { "op": "dupn 3", "stack_out": [ "maybe_value%3#0", @@ -10520,8 +10705,8 @@ "tmp%1#0" ] }, - "1676": { - "op": "bytec_1 // \"\"", + "1725": { + "op": "bytec_2 // \"\"", "stack_out": [ "maybe_value%3#0", "next_list#0", @@ -10530,7 +10715,7 @@ "array_length%1#0" ] }, - "1677": { + "1726": { "op": "dupn 2", "stack_out": [ "maybe_value%3#0", @@ -10542,7 +10727,7 @@ "idx#0" ] }, - "1679": { + "1728": { "op": "frame_dig -2", "defined_out": [ "label#0 (copy)" @@ -10558,7 +10743,7 @@ "label#0 (copy)" ] }, - "1681": { + "1730": { "op": "box_len", "defined_out": [ "cond#1", @@ -10576,7 +10761,7 @@ "cond#1" ] }, - "1682": { + "1731": { "op": "bury 1", "stack_out": [ "maybe_value%3#0", @@ -10589,7 +10774,7 @@ "cond#1" ] }, - "1684": { + "1733": { "op": "bnz remove_label_from_asset_after_if_else@20", "stack_out": [ "maybe_value%3#0", @@ -10601,7 +10786,7 @@ "idx#0" ] }, - "1687": { + "1736": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -10617,7 +10802,7 @@ "\"ERR:NOEXIST\"" ] }, - "1688": { + "1737": { "op": "log", "stack_out": [ "maybe_value%3#0", @@ -10629,10 +10814,10 @@ "idx#0" ] }, - "1689": { + "1738": { "op": "err" }, - "1690": { + "1739": { "block": "remove_label_from_asset_after_if_else@20", "stack_in": [ "maybe_value%3#0", @@ -10658,7 +10843,7 @@ "label#0 (copy)" ] }, - "1692": { + "1741": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [ @@ -10671,7 +10856,7 @@ "idx#0" ] }, - "1695": { + "1744": { "op": "intc_1 // 0", "defined_out": [ "found#0" @@ -10687,7 +10872,7 @@ "found#0" ] }, - "1696": { + "1745": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -10702,7 +10887,7 @@ "idx#0" ] }, - "1698": { + "1747": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)", @@ -10719,7 +10904,7 @@ "asset#0 (copy)" ] }, - "1700": { + "1749": { "op": "itob", "defined_out": [ "found#0", @@ -10736,7 +10921,7 @@ "tmp%1#0" ] }, - "1701": { + "1750": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -10750,7 +10935,7 @@ "tmp%1#0" ] }, - "1702": { + "1751": { "op": "frame_bury 3", "defined_out": [ "found#0", @@ -10767,7 +10952,7 @@ "tmp%1#0" ] }, - "1704": { + "1753": { "op": "box_get", "defined_out": [ "found#0", @@ -10787,7 +10972,7 @@ "maybe_exists%1#0" ] }, - "1705": { + "1754": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -10801,7 +10986,7 @@ "maybe_value%1#0" ] }, - "1706": { + "1755": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -10815,7 +11000,7 @@ "0" ] }, - "1707": { + "1756": { "op": "extract_uint16", "defined_out": [ "found#0", @@ -10833,7 +11018,7 @@ "tmp%3#0" ] }, - "1708": { + "1757": { "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", @@ -10847,7 +11032,7 @@ "1" ] }, - "1709": { + "1758": { "op": "==", "defined_out": [ "found#0", @@ -10865,7 +11050,7 @@ "tmp%4#0" ] }, - "1710": { + "1759": { "op": "bz remove_label_from_asset_else_body@5", "stack_out": [ "maybe_value%3#0", @@ -10877,7 +11062,7 @@ "idx#0" ] }, - "1713": { + "1762": { "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", @@ -10890,7 +11075,7 @@ "tmp%1#0" ] }, - "1715": { + "1764": { "op": "box_get", "defined_out": [ "found#0", @@ -10910,7 +11095,7 @@ "maybe_exists%2#0" ] }, - "1716": { + "1765": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -10924,7 +11109,7 @@ "maybe_value%2#0" ] }, - "1717": { + "1766": { "op": "dup", "defined_out": [ "found#0", @@ -10944,7 +11129,7 @@ "maybe_value%2#0 (copy)" ] }, - "1718": { + "1767": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -10964,7 +11149,7 @@ "array_head_and_tail%0#0" ] }, - "1721": { + "1770": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -10978,7 +11163,7 @@ "maybe_value%2#0" ] }, - "1722": { + "1771": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -10993,7 +11178,7 @@ "0" ] }, - "1723": { + "1772": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -11013,7 +11198,7 @@ "array_length%0#0" ] }, - "1724": { + "1773": { "error": "Index access is out of bounds", "op": "assert // Index access is out of bounds", "stack_out": [ @@ -11027,7 +11212,7 @@ "array_head_and_tail%0#0" ] }, - "1725": { + "1774": { "op": "dup", "defined_out": [ "array_head_and_tail%0#0", @@ -11047,7 +11232,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1726": { + "1775": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -11062,7 +11247,7 @@ "0" ] }, - "1727": { + "1776": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -11082,7 +11267,7 @@ "item_offset%0#0" ] }, - "1728": { + "1777": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -11106,7 +11291,7 @@ "item_offset%0#0 (copy)" ] }, - "1729": { + "1778": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -11128,7 +11313,7 @@ "item_length%0#0" ] }, - "1730": { + "1779": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -11152,7 +11337,7 @@ "2" ] }, - "1731": { + "1780": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -11174,7 +11359,7 @@ "item_head_tail_length%0#0" ] }, - "1732": { + "1781": { "op": "extract3", "defined_out": [ "found#0", @@ -11192,7 +11377,7 @@ "tmp%7#0" ] }, - "1733": { + "1782": { "op": "extract 2 0", "defined_out": [ "found#0", @@ -11210,7 +11395,7 @@ "tmp%8#0" ] }, - "1736": { + "1785": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -11224,7 +11409,7 @@ "label#0 (copy)" ] }, - "1738": { + "1787": { "op": "==", "defined_out": [ "found#0", @@ -11242,7 +11427,7 @@ "tmp%9#0" ] }, - "1739": { + "1788": { "op": "bz remove_label_from_asset_else_body@3", "stack_out": [ "maybe_value%3#0", @@ -11254,7 +11439,7 @@ "idx#0" ] }, - "1742": { + "1791": { "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", @@ -11267,7 +11452,7 @@ "tmp%1#0" ] }, - "1744": { + "1793": { "op": "box_del", "defined_out": [ "found#0", @@ -11285,7 +11470,7 @@ "{box_del}" ] }, - "1745": { + "1794": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -11297,7 +11482,7 @@ "idx#0" ] }, - "1746": { + "1795": { "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", @@ -11310,7 +11495,7 @@ "found#0" ] }, - "1747": { + "1796": { "op": "frame_bury 5", "stack_out": [ "maybe_value%3#0", @@ -11322,7 +11507,7 @@ "idx#0" ] }, - "1749": { + "1798": { "block": "remove_label_from_asset_after_if_else@13", "stack_in": [ "maybe_value%3#0", @@ -11348,7 +11533,7 @@ "found#0" ] }, - "1751": { + "1800": { "op": "bnz remove_label_from_asset_after_if_else@16", "stack_out": [ "maybe_value%3#0", @@ -11360,7 +11545,7 @@ "idx#0" ] }, - "1754": { + "1803": { "op": "bytec_0 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"", @@ -11377,7 +11562,7 @@ "\"ERR:NOEXIST\"" ] }, - "1755": { + "1804": { "op": "log", "stack_out": [ "maybe_value%3#0", @@ -11389,10 +11574,10 @@ "idx#0" ] }, - "1756": { + "1805": { "op": "err" }, - "1757": { + "1806": { "block": "remove_label_from_asset_after_if_else@16", "stack_in": [ "maybe_value%3#0", @@ -11418,7 +11603,7 @@ "label#0 (copy)" ] }, - "1759": { + "1808": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -11436,7 +11621,7 @@ "maybe_exists%4#0" ] }, - "1760": { + "1809": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -11450,7 +11635,7 @@ "label_descriptor#0" ] }, - "1761": { + "1810": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -11468,7 +11653,7 @@ "label_descriptor#0 (copy)" ] }, - "1762": { + "1811": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -11488,7 +11673,7 @@ "2" ] }, - "1763": { + "1812": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -11506,7 +11691,7 @@ "tmp%20#0" ] }, - "1764": { + "1813": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -11526,7 +11711,7 @@ "1" ] }, - "1765": { + "1814": { "op": "-", "defined_out": [ "label_descriptor#0", @@ -11544,7 +11729,7 @@ "to_encode%0#0" ] }, - "1766": { + "1815": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -11562,7 +11747,7 @@ "val_as_bytes%0#0" ] }, - "1767": { + "1816": { "op": "replace2 2", "stack_out": [ "maybe_value%3#0", @@ -11575,7 +11760,7 @@ "label_descriptor#0" ] }, - "1769": { + "1818": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -11589,7 +11774,7 @@ "label#0 (copy)" ] }, - "1771": { + "1820": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -11607,7 +11792,7 @@ "{box_del}" ] }, - "1772": { + "1821": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -11620,7 +11805,7 @@ "label_descriptor#0" ] }, - "1773": { + "1822": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -11634,7 +11819,7 @@ "label#0 (copy)" ] }, - "1775": { + "1824": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -11648,7 +11833,7 @@ "label_descriptor#0" ] }, - "1776": { + "1825": { "op": "box_put", "stack_out": [ "maybe_value%3#0", @@ -11660,11 +11845,11 @@ "idx#0" ] }, - "1777": { + "1826": { "retsub": true, "op": "retsub" }, - "1778": { + "1827": { "block": "remove_label_from_asset_else_body@3", "stack_in": [ "maybe_value%3#0", @@ -11690,7 +11875,7 @@ "found#0" ] }, - "1779": { + "1828": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -11705,10 +11890,10 @@ "idx#0" ] }, - "1781": { + "1830": { "op": "b remove_label_from_asset_after_if_else@13" }, - "1784": { + "1833": { "block": "remove_label_from_asset_else_body@5", "stack_in": [ "maybe_value%3#0", @@ -11719,7 +11904,7 @@ "found#0", "idx#0" ], - "op": "bytec_2 // 0x0000", + "op": "bytec_3 // 0x0000", "defined_out": [ "next_list#0" ], @@ -11734,7 +11919,7 @@ "next_list#0" ] }, - "1785": { + "1834": { "op": "frame_bury 1", "defined_out": [ "next_list#0" @@ -11749,7 +11934,7 @@ "idx#0" ] }, - "1787": { + "1836": { "op": "frame_dig 3", "defined_out": [ "next_list#0", @@ -11766,7 +11951,7 @@ "tmp%1#0" ] }, - "1789": { + "1838": { "op": "box_get", "defined_out": [ "maybe_exists%3#0", @@ -11786,7 +11971,7 @@ "maybe_exists%3#0" ] }, - "1790": { + "1839": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -11800,7 +11985,7 @@ "maybe_value%3#0" ] }, - "1791": { + "1840": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -11815,7 +12000,7 @@ "maybe_value%3#0 (copy)" ] }, - "1792": { + "1841": { "op": "cover 2", "stack_out": [ "maybe_value%3#0", @@ -11830,7 +12015,7 @@ "maybe_value%3#0" ] }, - "1794": { + "1843": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%3#0", @@ -11850,7 +12035,7 @@ "maybe_exists%3#0" ] }, - "1796": { + "1845": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -11864,7 +12049,7 @@ "maybe_value%3#0" ] }, - "1797": { + "1846": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -11878,7 +12063,7 @@ "0" ] }, - "1798": { + "1847": { "op": "extract_uint16", "defined_out": [ "array_length%1#0", @@ -11897,7 +12082,7 @@ "array_length%1#0" ] }, - "1799": { + "1848": { "op": "frame_bury 4", "defined_out": [ "array_length%1#0", @@ -11915,7 +12100,7 @@ "idx#0" ] }, - "1801": { + "1850": { "op": "intc_1 // 0", "defined_out": [ "array_length%1#0", @@ -11935,7 +12120,7 @@ "idx#0" ] }, - "1802": { + "1851": { "op": "frame_bury 6", "defined_out": [ "array_length%1#0", @@ -11954,7 +12139,7 @@ "idx#0" ] }, - "1804": { + "1853": { "block": "remove_label_from_asset_for_header@6", "stack_in": [ "maybe_value%3#0", @@ -11980,7 +12165,7 @@ "idx#0" ] }, - "1806": { + "1855": { "op": "frame_dig 4", "defined_out": [ "array_length%1#0", @@ -11998,7 +12183,7 @@ "array_length%1#0" ] }, - "1808": { + "1857": { "op": "<", "defined_out": [ "array_length%1#0", @@ -12016,7 +12201,7 @@ "continue_looping%0#0" ] }, - "1809": { + "1858": { "op": "bz remove_label_from_asset_after_for@12", "stack_out": [ "maybe_value%3#0", @@ -12028,7 +12213,7 @@ "idx#0" ] }, - "1812": { + "1861": { "op": "frame_dig 0", "defined_out": [ "array_length%1#0", @@ -12046,7 +12231,7 @@ "maybe_value%3#0" ] }, - "1814": { + "1863": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%1#0", @@ -12065,7 +12250,7 @@ "array_head_and_tail%1#0" ] }, - "1817": { + "1866": { "op": "frame_dig 6", "stack_out": [ "maybe_value%3#0", @@ -12079,7 +12264,7 @@ "idx#0" ] }, - "1819": { + "1868": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -12101,7 +12286,7 @@ "2" ] }, - "1820": { + "1869": { "op": "*", "defined_out": [ "array_head_and_tail%1#0", @@ -12122,7 +12307,7 @@ "item_offset_offset%1#0" ] }, - "1821": { + "1870": { "op": "dig 1", "defined_out": [ "array_head_and_tail%1#0", @@ -12145,7 +12330,7 @@ "array_head_and_tail%1#0 (copy)" ] }, - "1823": { + "1872": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -12160,7 +12345,7 @@ "item_offset_offset%1#0" ] }, - "1824": { + "1873": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%1#0", @@ -12181,7 +12366,7 @@ "item_offset%1#0" ] }, - "1825": { + "1874": { "op": "dup2", "defined_out": [ "array_head_and_tail%1#0", @@ -12206,7 +12391,7 @@ "item_offset%1#0 (copy)" ] }, - "1826": { + "1875": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%1#0", @@ -12229,7 +12414,7 @@ "item_length%1#0" ] }, - "1827": { + "1876": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%3#0", @@ -12245,7 +12430,7 @@ "2" ] }, - "1828": { + "1877": { "op": "+", "defined_out": [ "array_head_and_tail%1#0", @@ -12268,7 +12453,7 @@ "item_head_tail_length%1#0" ] }, - "1829": { + "1878": { "op": "extract3", "defined_out": [ "array_length%1#0", @@ -12287,7 +12472,7 @@ "stored_label#0" ] }, - "1830": { + "1879": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -12301,7 +12486,7 @@ "stored_label#0" ] }, - "1831": { + "1880": { "op": "frame_bury 2", "defined_out": [ "array_length%1#0", @@ -12320,7 +12505,7 @@ "stored_label#0" ] }, - "1833": { + "1882": { "op": "extract 2 0", "defined_out": [ "array_length%1#0", @@ -12340,7 +12525,7 @@ "tmp%14#0" ] }, - "1836": { + "1885": { "op": "frame_dig -2", "defined_out": [ "array_length%1#0", @@ -12362,7 +12547,7 @@ "label#0 (copy)" ] }, - "1838": { + "1887": { "op": "!=", "defined_out": [ "array_length%1#0", @@ -12382,7 +12567,7 @@ "tmp%15#0" ] }, - "1839": { + "1888": { "op": "bz remove_label_from_asset_else_body@9", "stack_out": [ "maybe_value%3#0", @@ -12394,7 +12579,7 @@ "idx#0" ] }, - "1842": { + "1891": { "op": "frame_dig 1", "defined_out": [ "array_length%1#0", @@ -12414,7 +12599,7 @@ "next_list#0" ] }, - "1844": { + "1893": { "op": "frame_dig 2", "stack_out": [ "maybe_value%3#0", @@ -12428,7 +12613,7 @@ "stored_label#0" ] }, - "1846": { + "1895": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -12451,7 +12636,7 @@ "1" ] }, - "1847": { + "1896": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -12465,7 +12650,7 @@ "next_list#0" ] }, - "1850": { + "1899": { "op": "frame_bury 1", "defined_out": [ "array_length%1#0", @@ -12484,7 +12669,7 @@ "idx#0" ] }, - "1852": { + "1901": { "block": "remove_label_from_asset_after_if_else@10", "stack_in": [ "maybe_value%3#0", @@ -12510,7 +12695,7 @@ "idx#0" ] }, - "1854": { + "1903": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -12528,7 +12713,7 @@ "1" ] }, - "1855": { + "1904": { "op": "+", "stack_out": [ "maybe_value%3#0", @@ -12541,7 +12726,7 @@ "idx#0" ] }, - "1856": { + "1905": { "op": "frame_bury 6", "defined_out": [ "idx#0" @@ -12556,10 +12741,10 @@ "idx#0" ] }, - "1858": { + "1907": { "op": "b remove_label_from_asset_for_header@6" }, - "1861": { + "1910": { "block": "remove_label_from_asset_else_body@9", "stack_in": [ "maybe_value%3#0", @@ -12585,7 +12770,7 @@ "found#0" ] }, - "1862": { + "1911": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -12600,10 +12785,10 @@ "idx#0" ] }, - "1864": { + "1913": { "op": "b remove_label_from_asset_after_if_else@10" }, - "1867": { + "1916": { "block": "remove_label_from_asset_after_for@12", "stack_in": [ "maybe_value%3#0", @@ -12629,7 +12814,7 @@ "tmp%1#0" ] }, - "1869": { + "1918": { "op": "dup", "defined_out": [ "tmp%1#0", @@ -12647,7 +12832,7 @@ "tmp%1#0 (copy)" ] }, - "1870": { + "1919": { "op": "box_del", "defined_out": [ "tmp%1#0", @@ -12665,7 +12850,7 @@ "{box_del}" ] }, - "1871": { + "1920": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -12678,7 +12863,7 @@ "tmp%1#0" ] }, - "1872": { + "1921": { "op": "frame_dig 1", "defined_out": [ "next_list#0", @@ -12696,7 +12881,7 @@ "next_list#0" ] }, - "1874": { + "1923": { "op": "box_put", "stack_out": [ "maybe_value%3#0", @@ -12708,10 +12893,10 @@ "idx#0" ] }, - "1875": { + "1924": { "op": "b remove_label_from_asset_after_if_else@13" }, - "1878": { + "1927": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", "params": { "asset#0": "uint64" @@ -12720,7 +12905,7 @@ "stack_in": [], "op": "proto 1 1" }, - "1881": { + "1930": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -12729,7 +12914,7 @@ "asset#0 (copy)" ] }, - "1883": { + "1932": { "op": "itob", "defined_out": [ "tmp%0#0" @@ -12738,7 +12923,7 @@ "tmp%0#0" ] }, - "1884": { + "1933": { "op": "dup", "defined_out": [ "tmp%0#0" @@ -12748,7 +12933,7 @@ "tmp%0#0" ] }, - "1885": { + "1934": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -12761,27 +12946,27 @@ "maybe_exists%0#0" ] }, - "1886": { + "1935": { "op": "bury 1", "stack_out": [ "tmp%0#0", "maybe_exists%0#0" ] }, - "1888": { + "1937": { "op": "bz get_asset_labels_after_if_else@2", "stack_out": [ "tmp%0#0" ] }, - "1891": { + "1940": { "op": "frame_dig 0", "stack_out": [ "tmp%0#0", "tmp%0#0" ] }, - "1893": { + "1942": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -12794,7 +12979,7 @@ "maybe_exists%1#0" ] }, - "1894": { + "1943": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -12802,19 +12987,19 @@ "maybe_value%1#0" ] }, - "1895": { + "1944": { "op": "swap" }, - "1896": { + "1945": { "retsub": true, "op": "retsub" }, - "1897": { + "1946": { "block": "get_asset_labels_after_if_else@2", "stack_in": [ "tmp%0#0" ], - "op": "bytec_2 // 0x0000", + "op": "bytec_3 // 0x0000", "defined_out": [ "0x0000" ], @@ -12823,14 +13008,14 @@ "0x0000" ] }, - "1898": { + "1947": { "op": "swap" }, - "1899": { + "1948": { "retsub": true, "op": "retsub" }, - "1900": { + "1949": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", "params": { "assets#0": "bytes" @@ -12839,19 +13024,19 @@ "stack_in": [], "op": "proto 1 1" }, - "1903": { + "1952": { "op": "intc_1 // 0", "stack_out": [ "tmp%0#0" ] }, - "1904": { - "op": "bytec_2 // 0x0000" + "1953": { + "op": "bytec_3 // 0x0000" }, - "1905": { + "1954": { "op": "frame_dig -1" }, - "1907": { + "1956": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -12865,7 +13050,7 @@ "0" ] }, - "1908": { + "1957": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -12877,7 +13062,7 @@ "array_length%0#0" ] }, - "1909": { + "1958": { "op": "intc_1 // 0", "defined_out": [ "_i#0", @@ -12891,7 +13076,7 @@ "_i#0" ] }, - "1910": { + "1959": { "block": "get_assets_labels_for_header@1", "stack_in": [ "tmp%0#0", @@ -12911,7 +13096,7 @@ "_i#0" ] }, - "1912": { + "1961": { "op": "frame_dig 2", "defined_out": [ "_i#0", @@ -12926,7 +13111,7 @@ "array_length%0#0" ] }, - "1914": { + "1963": { "op": "<", "defined_out": [ "_i#0", @@ -12941,7 +13126,7 @@ "continue_looping%0#0" ] }, - "1915": { + "1964": { "op": "bz get_assets_labels_after_for@7", "stack_out": [ "tmp%0#0", @@ -12950,7 +13135,7 @@ "_i#0" ] }, - "1918": { + "1967": { "op": "frame_dig -1", "defined_out": [ "_i#0", @@ -12965,7 +13150,7 @@ "assets#0 (copy)" ] }, - "1920": { + "1969": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -12980,7 +13165,7 @@ "array_head_and_tail%0#0" ] }, - "1923": { + "1972": { "op": "frame_dig 3", "stack_out": [ "tmp%0#0", @@ -12991,7 +13176,7 @@ "_i#0" ] }, - "1925": { + "1974": { "op": "pushint 8 // 8", "defined_out": [ "8", @@ -13009,7 +13194,7 @@ "8" ] }, - "1927": { + "1976": { "op": "*", "defined_out": [ "_i#0", @@ -13026,7 +13211,7 @@ "item_offset%0#0" ] }, - "1928": { + "1977": { "op": "extract_uint64", "defined_out": [ "_i#0", @@ -13041,7 +13226,7 @@ "asset#0" ] }, - "1929": { + "1978": { "op": "itob", "defined_out": [ "_i#0", @@ -13056,7 +13241,7 @@ "tmp%0#0" ] }, - "1930": { + "1979": { "op": "dup", "stack_out": [ "tmp%0#0", @@ -13067,7 +13252,7 @@ "tmp%0#0" ] }, - "1931": { + "1980": { "op": "frame_bury 0", "defined_out": [ "_i#0", @@ -13082,7 +13267,7 @@ "tmp%0#0" ] }, - "1933": { + "1982": { "op": "box_len", "defined_out": [ "_i#0", @@ -13100,7 +13285,7 @@ "maybe_exists%0#0" ] }, - "1934": { + "1983": { "op": "bury 1", "stack_out": [ "tmp%0#0", @@ -13110,7 +13295,7 @@ "maybe_exists%0#0" ] }, - "1936": { + "1985": { "op": "bz get_assets_labels_else_body@4", "stack_out": [ "tmp%0#0", @@ -13119,7 +13304,7 @@ "_i#0" ] }, - "1939": { + "1988": { "op": "frame_dig 0", "stack_out": [ "tmp%0#0", @@ -13129,7 +13314,7 @@ "tmp%0#0" ] }, - "1941": { + "1990": { "op": "box_get", "defined_out": [ "_i#0", @@ -13147,7 +13332,7 @@ "maybe_exists%1#0" ] }, - "1942": { + "1991": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -13158,7 +13343,7 @@ "maybe_value%1#0" ] }, - "1943": { + "1992": { "op": "bytec 6 // 0x0002", "defined_out": [ "0x0002", @@ -13176,7 +13361,7 @@ "0x0002" ] }, - "1945": { + "1994": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -13187,7 +13372,7 @@ "maybe_value%1#0" ] }, - "1946": { + "1995": { "op": "concat", "defined_out": [ "_i#0", @@ -13203,7 +13388,7 @@ "result%1#0" ] }, - "1947": { + "1996": { "op": "frame_dig 1", "defined_out": [ "_i#0", @@ -13221,7 +13406,7 @@ "out#0" ] }, - "1949": { + "1998": { "op": "dup", "defined_out": [ "_i#0", @@ -13241,7 +13426,7 @@ "out#0 (copy)" ] }, - "1950": { + "1999": { "op": "intc_1 // 0", "stack_out": [ "tmp%0#0", @@ -13254,7 +13439,7 @@ "0" ] }, - "1951": { + "2000": { "op": "extract_uint16", "defined_out": [ "_i#0", @@ -13274,7 +13459,7 @@ "l_count%0#0" ] }, - "1952": { + "2001": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -13286,7 +13471,7 @@ "out#0" ] }, - "1953": { + "2002": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -13307,7 +13492,7 @@ "l_head_and_tail%0#0" ] }, - "1956": { + "2005": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -13330,7 +13515,7 @@ "1" ] }, - "1957": { + "2006": { "op": "uncover 3", "stack_out": [ "tmp%0#0", @@ -13343,7 +13528,7 @@ "result%1#0" ] }, - "1959": { + "2008": { "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", "op": "callsub dynamic_array_concat_dynamic_element", "stack_out": [ @@ -13354,7 +13539,7 @@ "out#0" ] }, - "1962": { + "2011": { "op": "frame_bury 1", "defined_out": [ "_i#0", @@ -13369,7 +13554,7 @@ "_i#0" ] }, - "1964": { + "2013": { "block": "get_assets_labels_after_if_else@5", "stack_in": [ "tmp%0#0", @@ -13389,7 +13574,7 @@ "_i#0" ] }, - "1966": { + "2015": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -13404,7 +13589,7 @@ "1" ] }, - "1967": { + "2016": { "op": "+", "stack_out": [ "tmp%0#0", @@ -13414,7 +13599,7 @@ "_i#0" ] }, - "1968": { + "2017": { "op": "frame_bury 3", "defined_out": [ "_i#0" @@ -13426,10 +13611,10 @@ "_i#0" ] }, - "1970": { + "2019": { "op": "b get_assets_labels_for_header@1" }, - "1973": { + "2022": { "block": "get_assets_labels_else_body@4", "stack_in": [ "tmp%0#0", @@ -13449,7 +13634,7 @@ "out#0" ] }, - "1975": { + "2024": { "op": "dup", "defined_out": [ "out#0", @@ -13464,7 +13649,7 @@ "out#0 (copy)" ] }, - "1976": { + "2025": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -13481,7 +13666,7 @@ "0" ] }, - "1977": { + "2026": { "op": "extract_uint16", "defined_out": [ "l_count%1#0", @@ -13496,7 +13681,7 @@ "l_count%1#0" ] }, - "1978": { + "2027": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -13507,7 +13692,7 @@ "out#0" ] }, - "1979": { + "2028": { "op": "extract 2 0", "defined_out": [ "l_count%1#0", @@ -13523,7 +13708,7 @@ "l_head_and_tail%1#0" ] }, - "1982": { + "2031": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -13541,7 +13726,7 @@ "1" ] }, - "1983": { + "2032": { "op": "pushbytes 0x00020000", "defined_out": [ "0x00020000", @@ -13561,7 +13746,7 @@ "0x00020000" ] }, - "1989": { + "2038": { "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", "op": "callsub dynamic_array_concat_dynamic_element", "stack_out": [ @@ -13572,7 +13757,7 @@ "out#0" ] }, - "1992": { + "2041": { "op": "frame_bury 1", "defined_out": [ "out#0" @@ -13584,10 +13769,10 @@ "_i#0" ] }, - "1994": { + "2043": { "op": "b get_assets_labels_after_if_else@5" }, - "1997": { + "2046": { "block": "get_assets_labels_after_for@7", "stack_in": [ "tmp%0#0", @@ -13607,10 +13792,577 @@ "out#0" ] }, - "1999": { + "2048": { "op": "frame_bury 0" }, - "2001": { + "2050": { + "retsub": true, + "op": "retsub" + }, + "2051": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", + "params": { + "asset_id#0": "uint64" + }, + "block": "_get_asset_micro", + "stack_in": [], + "op": "proto 1 1" + }, + "2054": { + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "asset_id#0 (copy)" + ] + }, + "2056": { + "op": "asset_params_get AssetUnitName", + "defined_out": [ + "b#0", + "check%0#0" + ], + "stack_out": [ + "b#0", + "check%0#0" + ] + }, + "2058": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "b#0" + ] + }, + "2059": { + "op": "dup", + "defined_out": [ + "b#0", + "b#0 (copy)" + ], + "stack_out": [ + "b#0", + "b#0 (copy)" + ] + }, + "2060": { + "op": "len", + "defined_out": [ + "b#0", + "length%0#0" + ], + "stack_out": [ + "b#0", + "length%0#0" + ] + }, + "2061": { + "op": "itob", + "defined_out": [ + "as_bytes%0#1", + "b#0" + ], + "stack_out": [ + "b#0", + "as_bytes%0#1" + ] + }, + "2062": { + "op": "extract 6 2", + "defined_out": [ + "b#0", + "length_uint16%0#0" + ], + "stack_out": [ + "b#0", + "length_uint16%0#0" + ] + }, + "2065": { + "op": "swap", + "stack_out": [ + "length_uint16%0#0", + "b#0" + ] + }, + "2066": { + "op": "concat", + "defined_out": [ + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0" + ] + }, + "2067": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "asset_id#0 (copy)" + ] + }, + "2069": { + "op": "asset_params_get AssetDecimals", + "defined_out": [ + "check%1#0", + "encoded_value%0#0", + "value%1#0" + ], + "stack_out": [ + "encoded_value%0#0", + "value%1#0", + "check%1#0" + ] + }, + "2071": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "value%1#0" + ] + }, + "2072": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0" + ] + }, + "2073": { + "op": "dup", + "defined_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ], + "stack_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ] + }, + "2074": { + "op": "bitlen", + "defined_out": [ + "bitlen%0#0", + "encoded_value%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0", + "bitlen%0#0" + ] + }, + "2075": { + "op": "pushint 8 // 8", + "defined_out": [ + "8", + "bitlen%0#0", + "encoded_value%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0", + "bitlen%0#0", + "8" + ] + }, + "2077": { + "op": "<=", + "defined_out": [ + "encoded_value%0#0", + "no_overflow%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0", + "no_overflow%0#0" + ] + }, + "2078": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "encoded_value%0#0", + "val_as_bytes%0#0" + ] + }, + "2079": { + "op": "extract 7 1", + "defined_out": [ + "encoded_value%0#0", + "uint8%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "uint8%0#0" + ] + }, + "2082": { + "op": "pushbytes 0x0003", + "defined_out": [ + "0x0003", + "encoded_value%0#0", + "uint8%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "uint8%0#0", + "0x0003" + ] + }, + "2086": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "0x0003", + "uint8%0#0" + ] + }, + "2087": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%2#0", + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2088": { + "op": "swap", + "stack_out": [ + "encoded_tuple_buffer%2#0", + "encoded_value%0#0" + ] + }, + "2089": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%3#0" + ], + "stack_out": [ + "encoded_tuple_buffer%3#0" + ] + }, + "2090": { + "retsub": true, + "op": "retsub" + }, + "2091": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_micro", + "stack_in": [], + "op": "proto 1 1" + }, + "2094": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "2096": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", + "op": "callsub _get_asset_micro", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2099": { + "retsub": true, + "op": "retsub" + }, + "2100": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_micro", + "stack_in": [], + "op": "proto 1 0" + }, + "2103": { + "op": "frame_dig -1", + "defined_out": [ + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)" + ] + }, + "2105": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)", + "0" + ] + }, + "2106": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "2107": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2108": { + "block": "get_assets_micro_for_header@1", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2110": { + "op": "frame_dig 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "2112": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "2113": { + "op": "bz get_assets_micro_after_for@4", + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2116": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "2118": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "2121": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "2123": { + "op": "dup", + "defined_out": [ + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "_i#0 (copy)" + ] + }, + "2124": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)" + ] + }, + "2126": { + "op": "pushint 8 // 8", + "defined_out": [ + "8", + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "8" + ] + }, + "2128": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "2129": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%0#0" + ] + }, + "2130": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", + "op": "callsub _get_asset_micro", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%1#0" + ] + }, + "2133": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2134": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "2135": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2136": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2138": { + "op": "b get_assets_micro_for_header@1" + }, + "2141": { + "block": "get_assets_micro_after_for@4", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], "retsub": true, "op": "retsub" } diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal index 251bad6..3c4c3be 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal @@ -4,45 +4,84 @@ // smart_contracts.asset_labeling.contract.AssetLabeling.__algopy_entrypoint_with_init() -> uint64: main: intcblock 1 0 2 4294967295 4294967296 - bytecblock "ERR:NOEXIST" "" 0x0000 "admin" 0x151f7c75 "ERR:EXISTS" 0x0002 "ERR:UNAUTH" "ERR:LENGTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0001 + bytecblock "ERR:NOEXIST" 0x151f7c75 "" 0x0000 "admin" "ERR:EXISTS" 0x0002 "ERR:UNAUTH" "ERR:LENGTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0001 txn ApplicationID bnz main_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:45 + // smart_contracts/asset_labeling/contract.py:43 // self.admin = Txn.sender - bytec_3 // "admin" + bytec 4 // "admin" txn Sender app_global_put main_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txn NumAppArgs - bz main_bare_routing@17 - pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]" + bz main_bare_routing@19 + pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]", method "get_asset_micro(uint64)(string,uint8)", method "get_assets_micro(uint64[])void" txna ApplicationArgs 0 - match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 + match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 -main_after_if_else@19: - // smart_contracts/asset_labeling/contract.py:43 +main_after_if_else@21: + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): intc_1 // 0 return +main_get_assets_micro_route@18: + // smart_contracts/asset_labeling/contract.py:293 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:41 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:293 + // @abimethod(readonly=True) + callsub get_assets_micro + intc_0 // 1 + return + +main_get_asset_micro_route@17: + // smart_contracts/asset_labeling/contract.py:289 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:41 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + // smart_contracts/asset_labeling/contract.py:289 + // @abimethod(readonly=True) + callsub get_asset_micro + bytec_1 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + main_get_assets_labels_route@16: - // smart_contracts/asset_labeling/contract.py:269 + // smart_contracts/asset_labeling/contract.py:267 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:269 + // smart_contracts/asset_labeling/contract.py:267 // @abimethod(readonly=True) callsub get_assets_labels - bytec 4 // 0x151f7c75 + bytec_1 // 0x151f7c75 swap concat log @@ -50,22 +89,22 @@ main_get_assets_labels_route@16: return main_get_asset_labels_route@15: - // smart_contracts/asset_labeling/contract.py:262 + // smart_contracts/asset_labeling/contract.py:260 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:262 + // smart_contracts/asset_labeling/contract.py:260 // @abimethod(readonly=True) callsub get_asset_labels - bytec 4 // 0x151f7c75 + bytec_1 // 0x151f7c75 swap concat log @@ -73,64 +112,64 @@ main_get_asset_labels_route@15: return main_remove_label_from_asset_route@14: - // smart_contracts/asset_labeling/contract.py:228 + // smart_contracts/asset_labeling/contract.py:226 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:228 + // smart_contracts/asset_labeling/contract.py:226 // @abimethod() callsub remove_label_from_asset intc_0 // 1 return main_add_label_to_asset_route@13: - // smart_contracts/asset_labeling/contract.py:200 + // smart_contracts/asset_labeling/contract.py:198 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:200 + // smart_contracts/asset_labeling/contract.py:198 // @abimethod() callsub add_label_to_asset intc_0 // 1 return main_get_operator_labels_route@12: - // smart_contracts/asset_labeling/contract.py:184 + // smart_contracts/asset_labeling/contract.py:182 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts - // smart_contracts/asset_labeling/contract.py:184 + // smart_contracts/asset_labeling/contract.py:182 // @abimethod(readonly=True) callsub get_operator_labels - bytec 4 // 0x151f7c75 + bytec_1 // 0x151f7c75 swap concat log @@ -138,80 +177,80 @@ main_get_operator_labels_route@12: return main_remove_operator_from_label_route@11: - // smart_contracts/asset_labeling/contract.py:143 + // smart_contracts/asset_labeling/contract.py:141 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:143 + // smart_contracts/asset_labeling/contract.py:141 // @abimethod() callsub remove_operator_from_label intc_0 // 1 return main_add_operator_to_label_route@10: - // smart_contracts/asset_labeling/contract.py:115 + // smart_contracts/asset_labeling/contract.py:113 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:115 + // smart_contracts/asset_labeling/contract.py:113 // @abimethod() callsub add_operator_to_label intc_0 // 1 return main_log_labels_route@9: - // smart_contracts/asset_labeling/contract.py:84 + // smart_contracts/asset_labeling/contract.py:82 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:84 + // smart_contracts/asset_labeling/contract.py:82 // @abimethod(readonly=True) callsub log_labels intc_0 // 1 return main_get_label_route@8: - // smart_contracts/asset_labeling/contract.py:79 + // smart_contracts/asset_labeling/contract.py:77 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 - // smart_contracts/asset_labeling/contract.py:79 + // smart_contracts/asset_labeling/contract.py:77 // @abimethod(readonly=True) callsub get_label - bytec 4 // 0x151f7c75 + bytec_1 // 0x151f7c75 swap concat log @@ -219,67 +258,67 @@ main_get_label_route@8: return main_remove_label_route@7: - // smart_contracts/asset_labeling/contract.py:71 + // smart_contracts/asset_labeling/contract.py:69 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 - // smart_contracts/asset_labeling/contract.py:71 + // smart_contracts/asset_labeling/contract.py:69 // @abimethod() callsub remove_label intc_0 // 1 return main_add_label_route@6: - // smart_contracts/asset_labeling/contract.py:60 + // smart_contracts/asset_labeling/contract.py:58 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:60 + // smart_contracts/asset_labeling/contract.py:58 // @abimethod() callsub add_label intc_0 // 1 return main_change_admin_route@5: - // smart_contracts/asset_labeling/contract.py:55 + // smart_contracts/asset_labeling/contract.py:53 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts - // smart_contracts/asset_labeling/contract.py:55 + // smart_contracts/asset_labeling/contract.py:53 // @abimethod() callsub change_admin intc_0 // 1 return -main_bare_routing@17: - // smart_contracts/asset_labeling/contract.py:43 +main_bare_routing@19: + // smart_contracts/asset_labeling/contract.py:41 // class AssetLabeling(ARC4Contract): txn OnCompletion - bnz main_after_if_else@19 + bnz main_after_if_else@21 txn ApplicationID ! assert // can only call when creating @@ -369,7 +408,7 @@ dynamic_array_concat_byte_length_head_after_for@5: // _puya_lib.arc4.dynamic_array_concat_dynamic_element(array_items_count: uint64, array_head_and_tail: bytes, new_items_count: uint64, new_head_and_tail: bytes) -> bytes: dynamic_array_concat_dynamic_element: proto 4 1 - bytec_1 // "" + bytec_2 // "" dup frame_dig -2 intc_2 // 2 @@ -458,24 +497,24 @@ dynamic_array_concat_dynamic_element_after_for@8: // smart_contracts.asset_labeling.contract.AssetLabeling.admin_only() -> void: admin_only: - // smart_contracts/asset_labeling/contract.py:53 + // smart_contracts/asset_labeling/contract.py:51 // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) txn Sender intc_1 // 0 - bytec_3 // "admin" + bytec 4 // "admin" app_global_get_ex assert // check self.admin exists == - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz admin_only_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:53 + // smart_contracts/asset_labeling/contract.py:51 // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) bytec 7 // "ERR:UNAUTH" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err @@ -485,16 +524,16 @@ admin_only_after_if_else@3: // smart_contracts.asset_labeling.contract.AssetLabeling.change_admin(new_admin: bytes) -> void: change_admin: - // smart_contracts/asset_labeling/contract.py:55-56 + // smart_contracts/asset_labeling/contract.py:53-54 // @abimethod() // def change_admin(self, new_admin: Account) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:57 + // smart_contracts/asset_labeling/contract.py:55 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:58 + // smart_contracts/asset_labeling/contract.py:56 // self.admin = new_admin - bytec_3 // "admin" + bytec 4 // "admin" frame_dig -1 app_global_put retsub @@ -502,53 +541,53 @@ change_admin: // smart_contracts.asset_labeling.contract.AssetLabeling.add_label(id: bytes, name: bytes) -> void: add_label: - // smart_contracts/asset_labeling/contract.py:60-61 + // smart_contracts/asset_labeling/contract.py:58-59 // @abimethod() // def add_label(self, id: String, name: String) -> None: proto 2 0 - // smart_contracts/asset_labeling/contract.py:62 + // smart_contracts/asset_labeling/contract.py:60 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:63 + // smart_contracts/asset_labeling/contract.py:61 // ensure(id not in self.labels, S("ERR:EXISTS")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bz add_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:63 + // smart_contracts/asset_labeling/contract.py:61 // ensure(id not in self.labels, S("ERR:EXISTS")) bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err add_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:64 + // smart_contracts/asset_labeling/contract.py:62 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) frame_dig -2 len intc_2 // 2 == - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz add_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:64 + // smart_contracts/asset_labeling/contract.py:62 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) bytec 8 // "ERR:LENGTH" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err add_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:66 + // smart_contracts/asset_labeling/contract.py:64 // arc4.String(name), frame_dig -1 len @@ -556,7 +595,7 @@ add_label_after_if_else@7: extract 6 2 frame_dig -1 concat - // smart_contracts/asset_labeling/contract.py:65-69 + // smart_contracts/asset_labeling/contract.py:63-67 // self.labels[id] = LabelDescriptor( // arc4.String(name), // arc4.UInt64(0), @@ -576,53 +615,53 @@ add_label_after_if_else@7: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_label(id: bytes) -> void: remove_label: - // smart_contracts/asset_labeling/contract.py:71-72 + // smart_contracts/asset_labeling/contract.py:69-70 // @abimethod() // def remove_label(self, id: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:73 + // smart_contracts/asset_labeling/contract.py:71 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:74 + // smart_contracts/asset_labeling/contract.py:72 // ensure(id in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:74 + // smart_contracts/asset_labeling/contract.py:72 // ensure(id in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:75 + // smart_contracts/asset_labeling/contract.py:73 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) frame_dig -1 len intc_2 // 2 == - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:75 + // smart_contracts/asset_labeling/contract.py:73 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) bytec 8 // "ERR:LENGTH" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:76 + // smart_contracts/asset_labeling/contract.py:74 // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) frame_dig -1 box_get @@ -630,21 +669,21 @@ remove_label_after_if_else@7: extract 2 8 // on error: Index access is out of bounds bytec 9 // 0x0000000000000000 b== - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_label_after_if_else@11 - // smart_contracts/asset_labeling/contract.py:76 + // smart_contracts/asset_labeling/contract.py:74 // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) bytec 10 // "ERR:NOEMPTY" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_label_after_if_else@11: - // smart_contracts/asset_labeling/contract.py:77 + // smart_contracts/asset_labeling/contract.py:75 // del self.labels[id] frame_dig -1 box_del @@ -654,30 +693,30 @@ remove_label_after_if_else@11: // smart_contracts.asset_labeling.contract.AssetLabeling.get_label(id: bytes) -> bytes: get_label: - // smart_contracts/asset_labeling/contract.py:79-80 + // smart_contracts/asset_labeling/contract.py:77-78 // @abimethod(readonly=True) // def get_label(self, id: String) -> LabelDescriptor: proto 1 1 - // smart_contracts/asset_labeling/contract.py:81 + // smart_contracts/asset_labeling/contract.py:79 // ensure(id in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz get_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:81 + // smart_contracts/asset_labeling/contract.py:79 // ensure(id in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err get_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:82 + // smart_contracts/asset_labeling/contract.py:80 // return self.labels[id] frame_dig -1 box_get @@ -687,11 +726,11 @@ get_label_after_if_else@3: // smart_contracts.asset_labeling.contract.AssetLabeling.log_labels(ids: bytes) -> void: log_labels: - // smart_contracts/asset_labeling/contract.py:84-85 + // smart_contracts/asset_labeling/contract.py:82-83 // @abimethod(readonly=True) // def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:86 + // smart_contracts/asset_labeling/contract.py:84 // for _idx, label_id in uenumerate(ids): frame_dig -1 intc_1 // 0 @@ -699,7 +738,7 @@ log_labels: intc_1 // 0 log_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:86 + // smart_contracts/asset_labeling/contract.py:84 // for _idx, label_id in uenumerate(ids): frame_dig 1 frame_dig 0 @@ -720,7 +759,7 @@ log_labels_for_header@1: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:87 + // smart_contracts/asset_labeling/contract.py:85 // log(self.labels[label_id.native]) extract 2 0 box_get @@ -737,25 +776,25 @@ log_labels_after_for@4: // smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only(label: bytes) -> void: admin_or_operator_only: - // smart_contracts/asset_labeling/contract.py:91-92 + // smart_contracts/asset_labeling/contract.py:89-90 // @subroutine // def admin_or_operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:93 + // smart_contracts/asset_labeling/contract.py:91 // if Txn.sender == self.admin: txn Sender intc_1 // 0 - bytec_3 // "admin" + bytec 4 // "admin" app_global_get_ex assert // check self.admin exists == bz admin_or_operator_only_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:94 + // smart_contracts/asset_labeling/contract.py:92 // return retsub admin_or_operator_only_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:95 + // smart_contracts/asset_labeling/contract.py:93 // self.operator_only(label) frame_dig -1 callsub operator_only @@ -764,35 +803,35 @@ admin_or_operator_only_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.operator_only(label: bytes) -> void: operator_only: - // smart_contracts/asset_labeling/contract.py:97-98 + // smart_contracts/asset_labeling/contract.py:95-96 // @subroutine // def operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:100 + // smart_contracts/asset_labeling/contract.py:98 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) txn Sender frame_dig -1 callsub get_operator_label_index intc 4 // 4294967296 != - // smart_contracts/asset_labeling/contract.py:100-102 + // smart_contracts/asset_labeling/contract.py:98-100 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), bz operator_only_bool_false@3 - // smart_contracts/asset_labeling/contract.py:101 + // smart_contracts/asset_labeling/contract.py:99 // and self.get_operator_label_index(Txn.sender, label) txn Sender frame_dig -1 callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:102 + // smart_contracts/asset_labeling/contract.py:100 // != UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:101-102 + // smart_contracts/asset_labeling/contract.py:99-100 // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), != - // smart_contracts/asset_labeling/contract.py:100-102 + // smart_contracts/asset_labeling/contract.py:98-100 // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) // and self.get_operator_label_index(Txn.sender, label) // != UInt64(NOT_FOUND_VALUE), @@ -800,16 +839,16 @@ operator_only: intc_0 // 1 operator_only_bool_merge@4: - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz operator_only_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:103 + // smart_contracts/asset_labeling/contract.py:101 // S("ERR:UNAUTH"), bytec 7 // "ERR:UNAUTH" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err @@ -823,27 +862,27 @@ operator_only_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index(operator: bytes, label: bytes) -> uint64: get_operator_label_index: - // smart_contracts/asset_labeling/contract.py:106-107 + // smart_contracts/asset_labeling/contract.py:104-105 // @subroutine // def get_operator_label_index(self, operator: Account, label: String) -> UInt64: proto 2 1 intc_1 // 0 - bytec_1 // "" + bytec_2 // "" dup - // smart_contracts/asset_labeling/contract.py:108 + // smart_contracts/asset_labeling/contract.py:106 // if operator not in self.operators: frame_dig -2 box_len bury 1 bnz get_operator_label_index_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:109 + // smart_contracts/asset_labeling/contract.py:107 // return UInt64(NOT_FOUND_KEY) intc 4 // 4294967296 frame_bury 0 retsub get_operator_label_index_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:110 + // smart_contracts/asset_labeling/contract.py:108 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig -2 box_get @@ -859,7 +898,7 @@ get_operator_label_index_after_if_else@2: frame_bury 2 get_operator_label_index_for_header@3: - // smart_contracts/asset_labeling/contract.py:110 + // smart_contracts/asset_labeling/contract.py:108 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig 2 frame_dig 1 @@ -878,13 +917,13 @@ get_operator_label_index_for_header@3: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:111 + // smart_contracts/asset_labeling/contract.py:109 // if stored_label == label: extract 2 0 frame_dig -1 == bz get_operator_label_index_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:112 + // smart_contracts/asset_labeling/contract.py:110 // return idx frame_dig 2 frame_bury 0 @@ -898,7 +937,7 @@ get_operator_label_index_after_if_else@6: b get_operator_label_index_for_header@3 get_operator_label_index_after_for@8: - // smart_contracts/asset_labeling/contract.py:113 + // smart_contracts/asset_labeling/contract.py:111 // return UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 frame_bury 0 @@ -907,73 +946,73 @@ get_operator_label_index_after_for@8: // smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label(operator: bytes, label: bytes) -> void: add_operator_to_label: - // smart_contracts/asset_labeling/contract.py:115-116 + // smart_contracts/asset_labeling/contract.py:113-114 // @abimethod() // def add_operator_to_label(self, operator: Account, label: String) -> None: proto 2 0 - // smart_contracts/asset_labeling/contract.py:117 + // smart_contracts/asset_labeling/contract.py:115 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:118 + // smart_contracts/asset_labeling/contract.py:116 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz add_operator_to_label_after_if_else@10 - // smart_contracts/asset_labeling/contract.py:118 + // smart_contracts/asset_labeling/contract.py:116 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err add_operator_to_label_after_if_else@10: - // smart_contracts/asset_labeling/contract.py:119-120 + // smart_contracts/asset_labeling/contract.py:117-118 // # check if operator exists already // if operator in self.operators: frame_dig -2 box_len bury 1 bz add_operator_to_label_else_body@2 - // smart_contracts/asset_labeling/contract.py:123 + // smart_contracts/asset_labeling/contract.py:121 // self.get_operator_label_index(operator, label) frame_dig -2 frame_dig -1 callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:124 + // smart_contracts/asset_labeling/contract.py:122 // == UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:123-124 + // smart_contracts/asset_labeling/contract.py:121-122 // self.get_operator_label_index(operator, label) // == UInt64(NOT_FOUND_VALUE), == - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz add_operator_to_label_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:125 + // smart_contracts/asset_labeling/contract.py:123 // S("ERR:EXISTS"), bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err add_operator_to_label_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:128-129 + // smart_contracts/asset_labeling/contract.py:126-127 // # add label to operator // existing = self.operators[operator].copy() frame_dig -2 box_get assert // check self.operators entry exists - // smart_contracts/asset_labeling/contract.py:130 + // smart_contracts/asset_labeling/contract.py:128 // existing.append(arc4.String(label)) frame_dig -1 len @@ -983,7 +1022,7 @@ add_operator_to_label_after_if_else@6: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:131 + // smart_contracts/asset_labeling/contract.py:129 // self.operators[operator] = existing.copy() frame_dig -2 box_del @@ -993,26 +1032,26 @@ add_operator_to_label_after_if_else@6: box_put add_operator_to_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:136-137 + // smart_contracts/asset_labeling/contract.py:134-135 // # increment label operators // label_descriptor = self.labels[label].copy() frame_dig -1 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:139 + // smart_contracts/asset_labeling/contract.py:137 // label_descriptor.num_operators.native + UInt64(1) dup pushint 10 // 10 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:138-140 + // smart_contracts/asset_labeling/contract.py:136-138 // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native + UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:141 + // smart_contracts/asset_labeling/contract.py:139 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -1023,7 +1062,7 @@ add_operator_to_label_after_if_else@3: retsub add_operator_to_label_else_body@2: - // smart_contracts/asset_labeling/contract.py:133-134 + // smart_contracts/asset_labeling/contract.py:131-132 // # new operator, create new box // self.operators[operator] = arc4.DynamicArray(arc4.String(label)) frame_dig -1 @@ -1049,57 +1088,57 @@ add_operator_to_label_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label(operator: bytes, label: bytes) -> void: remove_operator_from_label: - // smart_contracts/asset_labeling/contract.py:143-144 + // smart_contracts/asset_labeling/contract.py:141-142 // @abimethod() // def remove_operator_from_label(self, operator: Account, label: String) -> None: proto 2 0 intc_1 // 0 dupn 4 - bytec_1 // "" + bytec_2 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:145 + // smart_contracts/asset_labeling/contract.py:143 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:147 + // smart_contracts/asset_labeling/contract.py:145 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_operator_from_label_after_if_else@28 - // smart_contracts/asset_labeling/contract.py:147 + // smart_contracts/asset_labeling/contract.py:145 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_operator_from_label_after_if_else@28: - // smart_contracts/asset_labeling/contract.py:148 + // smart_contracts/asset_labeling/contract.py:146 // ensure(operator in self.operators, S("ERR:NOEXIST")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_operator_from_label_after_if_else@32 - // smart_contracts/asset_labeling/contract.py:148 + // smart_contracts/asset_labeling/contract.py:146 // ensure(operator in self.operators, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_operator_from_label_after_if_else@32: - // smart_contracts/asset_labeling/contract.py:150-151 + // smart_contracts/asset_labeling/contract.py:148-149 // # ensure label exists in operator // label_idx = self.get_operator_label_index(operator, label) frame_dig -2 @@ -1107,27 +1146,27 @@ remove_operator_from_label_after_if_else@32: callsub get_operator_label_index dup frame_bury 7 - // smart_contracts/asset_labeling/contract.py:153 + // smart_contracts/asset_labeling/contract.py:151 // label_idx != UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 != - // smart_contracts/asset_labeling/contract.py:153-155 + // smart_contracts/asset_labeling/contract.py:151-153 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above bz remove_operator_from_label_bool_false@3 - // smart_contracts/asset_labeling/contract.py:154-155 + // smart_contracts/asset_labeling/contract.py:152-153 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above frame_dig 7 - // smart_contracts/asset_labeling/contract.py:155 + // smart_contracts/asset_labeling/contract.py:153 // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above intc 4 // 4294967296 - // smart_contracts/asset_labeling/contract.py:154-155 + // smart_contracts/asset_labeling/contract.py:152-153 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above != - // smart_contracts/asset_labeling/contract.py:153-155 + // smart_contracts/asset_labeling/contract.py:151-153 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above @@ -1135,21 +1174,21 @@ remove_operator_from_label_after_if_else@32: intc_0 // 1 remove_operator_from_label_bool_merge@4: - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_operator_from_label_after_if_else@24 - // smart_contracts/asset_labeling/contract.py:156 + // smart_contracts/asset_labeling/contract.py:154 // S("ERR:NOEXIST"), bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_operator_from_label_after_if_else@24: - // smart_contracts/asset_labeling/contract.py:159-160 + // smart_contracts/asset_labeling/contract.py:157-158 // # ensure only empty labels can be left operator-less // label_descriptor = self.labels[label].copy() frame_dig -1 @@ -1159,7 +1198,7 @@ remove_operator_from_label_after_if_else@24: cover 2 frame_bury 0 assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:162 + // smart_contracts/asset_labeling/contract.py:160 // label_descriptor.num_operators > 1 or label_descriptor.num_assets == 0, extract 10 8 // on error: Index access is out of bounds pushbytes 0x0000000000000001 @@ -1175,21 +1214,21 @@ remove_operator_from_label_bool_true@6: intc_0 // 1 remove_operator_from_label_bool_merge@8: - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_operator_from_label_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:163 + // smart_contracts/asset_labeling/contract.py:161 // S("ERR:NOEMPTY"), bytec 10 // "ERR:NOEMPTY" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_operator_from_label_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:167 + // smart_contracts/asset_labeling/contract.py:165 // label_descriptor.num_operators.native - UInt64(1) frame_dig 0 dup @@ -1197,14 +1236,14 @@ remove_operator_from_label_after_if_else@20: extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:165-168 + // smart_contracts/asset_labeling/contract.py:163-166 // # decr operator count // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native - UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:169 + // smart_contracts/asset_labeling/contract.py:167 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -1212,7 +1251,7 @@ remove_operator_from_label_after_if_else@20: frame_dig -1 swap box_put - // smart_contracts/asset_labeling/contract.py:171 + // smart_contracts/asset_labeling/contract.py:169 // if self.operators[operator].length == 1: frame_dig -2 box_get @@ -1222,7 +1261,7 @@ remove_operator_from_label_after_if_else@20: intc_0 // 1 == bz remove_operator_from_label_else_body@10 - // smart_contracts/asset_labeling/contract.py:172 + // smart_contracts/asset_labeling/contract.py:170 // del self.operators[operator] frame_dig -2 box_del @@ -1230,11 +1269,11 @@ remove_operator_from_label_after_if_else@20: retsub remove_operator_from_label_else_body@10: - // smart_contracts/asset_labeling/contract.py:174 + // smart_contracts/asset_labeling/contract.py:172 // next_list = arc4.DynamicArray[arc4.String]() - bytec_2 // 0x0000 + bytec_3 // 0x0000 frame_bury 2 - // smart_contracts/asset_labeling/contract.py:175-178 + // smart_contracts/asset_labeling/contract.py:173-176 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1253,7 +1292,7 @@ remove_operator_from_label_else_body@10: frame_bury 6 remove_operator_from_label_for_header@11: - // smart_contracts/asset_labeling/contract.py:175-178 + // smart_contracts/asset_labeling/contract.py:173-176 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1278,14 +1317,14 @@ remove_operator_from_label_for_header@11: + extract3 frame_bury 4 - // smart_contracts/asset_labeling/contract.py:179 + // smart_contracts/asset_labeling/contract.py:177 // if label_idx != idx: frame_dig 7 != frame_dig 2 frame_bury 3 bz remove_operator_from_label_after_if_else@14 - // smart_contracts/asset_labeling/contract.py:180 + // smart_contracts/asset_labeling/contract.py:178 // next_list.append(stored_label) frame_dig 2 frame_dig 4 @@ -1303,7 +1342,7 @@ remove_operator_from_label_after_if_else@14: b remove_operator_from_label_for_header@11 remove_operator_from_label_after_for@16: - // smart_contracts/asset_labeling/contract.py:182 + // smart_contracts/asset_labeling/contract.py:180 // self.operators[operator] = next_list.copy() frame_dig -2 box_del @@ -1324,17 +1363,17 @@ remove_operator_from_label_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels(operator: bytes) -> bytes: get_operator_labels: - // smart_contracts/asset_labeling/contract.py:184-185 + // smart_contracts/asset_labeling/contract.py:182-183 // @abimethod(readonly=True) // def get_operator_labels(self, operator: Account) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:186 + // smart_contracts/asset_labeling/contract.py:184 // if operator in self.operators: frame_dig -1 box_len bury 1 bz get_operator_labels_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:187 + // smart_contracts/asset_labeling/contract.py:185 // return self.operators[operator] frame_dig -1 box_get @@ -1342,10 +1381,10 @@ get_operator_labels: retsub get_operator_labels_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:34 + // smart_contracts/asset_labeling/contract.py:33 // return arc4.DynamicArray[arc4.String]() - bytec_2 // 0x0000 - // smart_contracts/asset_labeling/contract.py:188-189 + bytec_3 // 0x0000 + // smart_contracts/asset_labeling/contract.py:186-187 // # return empty list // return empty_list() retsub @@ -1353,38 +1392,38 @@ get_operator_labels_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset(label: bytes, asset: uint64) -> void: add_label_to_asset: - // smart_contracts/asset_labeling/contract.py:200-201 + // smart_contracts/asset_labeling/contract.py:198-199 // @abimethod() // def add_label_to_asset(self, label: String, asset: Asset) -> None: proto 2 0 intc_1 // 0 dup - bytec_1 // "" + bytec_2 // "" dup - // smart_contracts/asset_labeling/contract.py:202 + // smart_contracts/asset_labeling/contract.py:200 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz add_label_to_asset_after_if_else@19 - // smart_contracts/asset_labeling/contract.py:202 + // smart_contracts/asset_labeling/contract.py:200 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err add_label_to_asset_after_if_else@19: - // smart_contracts/asset_labeling/contract.py:204 + // smart_contracts/asset_labeling/contract.py:202 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:206 + // smart_contracts/asset_labeling/contract.py:204 // if asset in self.assets: frame_dig -1 itob @@ -1393,43 +1432,43 @@ add_label_to_asset_after_if_else@19: box_len bury 1 bz add_label_to_asset_else_body@2 - // smart_contracts/asset_labeling/contract.py:193 + // smart_contracts/asset_labeling/contract.py:191 // if asset not in self.assets: frame_dig 1 box_len bury 1 bnz add_label_to_asset_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:194 + // smart_contracts/asset_labeling/contract.py:192 // return UInt64(NOT_FOUND_KEY) intc 4 // 4294967296 add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12: - // smart_contracts/asset_labeling/contract.py:209 + // smart_contracts/asset_labeling/contract.py:207 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), intc_3 // 4294967295 == - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz add_label_to_asset_after_if_else@15 - // smart_contracts/asset_labeling/contract.py:210 + // smart_contracts/asset_labeling/contract.py:208 // S("ERR:EXISTS"), bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err add_label_to_asset_after_if_else@15: - // smart_contracts/asset_labeling/contract.py:213-214 + // smart_contracts/asset_labeling/contract.py:211-212 // # add label to operator // existing = self.assets[asset].copy() frame_dig 1 dup box_get assert // check self.assets entry exists - // smart_contracts/asset_labeling/contract.py:215 + // smart_contracts/asset_labeling/contract.py:213 // existing.append(arc4.String(label)) frame_dig -2 len @@ -1439,7 +1478,7 @@ add_label_to_asset_after_if_else@15: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:216 + // smart_contracts/asset_labeling/contract.py:214 // self.assets[asset] = existing.copy() dig 1 box_del @@ -1447,26 +1486,26 @@ add_label_to_asset_after_if_else@15: box_put add_label_to_asset_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:221-222 + // smart_contracts/asset_labeling/contract.py:219-220 // # incr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:224 + // smart_contracts/asset_labeling/contract.py:222 // label_descriptor.num_assets.native + UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:223-225 + // smart_contracts/asset_labeling/contract.py:221-223 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native + UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:226 + // smart_contracts/asset_labeling/contract.py:224 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1477,7 +1516,7 @@ add_label_to_asset_after_if_else@3: retsub add_label_to_asset_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:195 + // smart_contracts/asset_labeling/contract.py:193 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 1 box_get @@ -1493,7 +1532,7 @@ add_label_to_asset_after_if_else@6: frame_bury 3 add_label_to_asset_for_header@7: - // smart_contracts/asset_labeling/contract.py:195 + // smart_contracts/asset_labeling/contract.py:193 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 3 frame_dig 2 @@ -1512,14 +1551,14 @@ add_label_to_asset_for_header@7: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:196 + // smart_contracts/asset_labeling/contract.py:194 // if stored_label == label: extract 2 0 frame_dig -2 == bz add_label_to_asset_after_if_else@10 frame_dig 3 - // smart_contracts/asset_labeling/contract.py:209 + // smart_contracts/asset_labeling/contract.py:207 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 @@ -1531,15 +1570,15 @@ add_label_to_asset_after_if_else@10: b add_label_to_asset_for_header@7 add_label_to_asset_after_for@11: - // smart_contracts/asset_labeling/contract.py:198 + // smart_contracts/asset_labeling/contract.py:196 // return UInt64(NOT_FOUND_VALUE) intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:209 + // smart_contracts/asset_labeling/contract.py:207 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 add_label_to_asset_else_body@2: - // smart_contracts/asset_labeling/contract.py:218-219 + // smart_contracts/asset_labeling/contract.py:216-217 // # new operator, create new box // self.assets[asset] = arc4.DynamicArray(arc4.String(label)) frame_dig -2 @@ -1565,42 +1604,42 @@ add_label_to_asset_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset(label: bytes, asset: uint64) -> void: remove_label_from_asset: - // smart_contracts/asset_labeling/contract.py:228-229 + // smart_contracts/asset_labeling/contract.py:226-227 // @abimethod() // def remove_label_from_asset(self, label: String, asset: Asset) -> None: proto 2 0 intc_1 // 0 dupn 3 - bytec_1 // "" + bytec_2 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:230 + // smart_contracts/asset_labeling/contract.py:228 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: bnz remove_label_from_asset_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:230 + // smart_contracts/asset_labeling/contract.py:228 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_label_from_asset_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:232 + // smart_contracts/asset_labeling/contract.py:230 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:234 + // smart_contracts/asset_labeling/contract.py:232 // found = False intc_1 // 0 frame_bury 5 - // smart_contracts/asset_labeling/contract.py:235 + // smart_contracts/asset_labeling/contract.py:233 // if self.assets[asset].length == 1: frame_dig -1 itob @@ -1613,7 +1652,7 @@ remove_label_from_asset_after_if_else@20: intc_0 // 1 == bz remove_label_from_asset_else_body@5 - // smart_contracts/asset_labeling/contract.py:236 + // smart_contracts/asset_labeling/contract.py:234 // if self.assets[asset][0] == label: frame_dig 3 box_get @@ -1636,52 +1675,52 @@ remove_label_from_asset_after_if_else@20: frame_dig -2 == bz remove_label_from_asset_else_body@3 - // smart_contracts/asset_labeling/contract.py:237 + // smart_contracts/asset_labeling/contract.py:235 // del self.assets[asset] frame_dig 3 box_del pop - // smart_contracts/asset_labeling/contract.py:238 + // smart_contracts/asset_labeling/contract.py:236 // found = True intc_0 // 1 frame_bury 5 remove_label_from_asset_after_if_else@13: - // smart_contracts/asset_labeling/contract.py:27 + // smart_contracts/asset_labeling/contract.py:26 // if not cond: frame_dig 5 bnz remove_label_from_asset_after_if_else@16 - // smart_contracts/asset_labeling/contract.py:253 + // smart_contracts/asset_labeling/contract.py:251 // ensure(found, S("ERR:NOEXIST")) bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:28 + // smart_contracts/asset_labeling/contract.py:27 // log(msg) log - // smart_contracts/asset_labeling/contract.py:29 + // smart_contracts/asset_labeling/contract.py:28 // op.err() err remove_label_from_asset_after_if_else@16: - // smart_contracts/asset_labeling/contract.py:255-256 + // smart_contracts/asset_labeling/contract.py:253-254 // # decr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:258 + // smart_contracts/asset_labeling/contract.py:256 // label_descriptor.num_assets.native - UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:257-259 + // smart_contracts/asset_labeling/contract.py:255-257 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native - UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:260 + // smart_contracts/asset_labeling/contract.py:258 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1692,18 +1731,18 @@ remove_label_from_asset_after_if_else@16: retsub remove_label_from_asset_else_body@3: - // smart_contracts/asset_labeling/contract.py:240 + // smart_contracts/asset_labeling/contract.py:238 // found = False intc_1 // 0 frame_bury 5 b remove_label_from_asset_after_if_else@13 remove_label_from_asset_else_body@5: - // smart_contracts/asset_labeling/contract.py:242 + // smart_contracts/asset_labeling/contract.py:240 // next_list = arc4.DynamicArray[arc4.String]() - bytec_2 // 0x0000 + bytec_3 // 0x0000 frame_bury 1 - // smart_contracts/asset_labeling/contract.py:243-245 + // smart_contracts/asset_labeling/contract.py:241-243 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1721,7 +1760,7 @@ remove_label_from_asset_else_body@5: frame_bury 6 remove_label_from_asset_for_header@6: - // smart_contracts/asset_labeling/contract.py:243-245 + // smart_contracts/asset_labeling/contract.py:241-243 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1744,13 +1783,13 @@ remove_label_from_asset_for_header@6: extract3 dup frame_bury 2 - // smart_contracts/asset_labeling/contract.py:246 + // smart_contracts/asset_labeling/contract.py:244 // if stored_label != label: extract 2 0 frame_dig -2 != bz remove_label_from_asset_else_body@9 - // smart_contracts/asset_labeling/contract.py:247 + // smart_contracts/asset_labeling/contract.py:245 // next_list.append(stored_label) frame_dig 1 frame_dig 2 @@ -1766,14 +1805,14 @@ remove_label_from_asset_after_if_else@10: b remove_label_from_asset_for_header@6 remove_label_from_asset_else_body@9: - // smart_contracts/asset_labeling/contract.py:249 + // smart_contracts/asset_labeling/contract.py:247 // found = True intc_0 // 1 frame_bury 5 b remove_label_from_asset_after_if_else@10 remove_label_from_asset_after_for@12: - // smart_contracts/asset_labeling/contract.py:251 + // smart_contracts/asset_labeling/contract.py:249 // self.assets[asset] = next_list.copy() frame_dig 3 dup @@ -1786,11 +1825,11 @@ remove_label_from_asset_after_for@12: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels(asset: uint64) -> bytes: get_asset_labels: - // smart_contracts/asset_labeling/contract.py:262-263 + // smart_contracts/asset_labeling/contract.py:260-261 // @abimethod(readonly=True) // def get_asset_labels(self, asset: Asset) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:264 + // smart_contracts/asset_labeling/contract.py:262 // if asset in self.assets: frame_dig -1 itob @@ -1798,7 +1837,7 @@ get_asset_labels: box_len bury 1 bz get_asset_labels_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:265 + // smart_contracts/asset_labeling/contract.py:263 // return self.assets[asset] frame_dig 0 box_get @@ -1807,10 +1846,10 @@ get_asset_labels: retsub get_asset_labels_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:34 + // smart_contracts/asset_labeling/contract.py:33 // return arc4.DynamicArray[arc4.String]() - bytec_2 // 0x0000 - // smart_contracts/asset_labeling/contract.py:266-267 + bytec_3 // 0x0000 + // smart_contracts/asset_labeling/contract.py:264-265 // # return empty // return empty_list() swap @@ -1819,17 +1858,17 @@ get_asset_labels_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels(assets: bytes) -> bytes: get_assets_labels: - // smart_contracts/asset_labeling/contract.py:269-272 + // smart_contracts/asset_labeling/contract.py:267-270 // @abimethod(readonly=True) // def get_assets_labels( // self, assets: arc4.DynamicArray[arc4.UInt64] // ) -> arc4.DynamicArray[LabelList]: proto 1 1 intc_1 // 0 - // smart_contracts/asset_labeling/contract.py:273 + // smart_contracts/asset_labeling/contract.py:271 // out = arc4.DynamicArray[LabelList]() - bytec_2 // 0x0000 - // smart_contracts/asset_labeling/contract.py:274 + bytec_3 // 0x0000 + // smart_contracts/asset_labeling/contract.py:272 // for _i, asset_id in uenumerate(assets): frame_dig -1 intc_1 // 0 @@ -1837,7 +1876,7 @@ get_assets_labels: intc_1 // 0 get_assets_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:274 + // smart_contracts/asset_labeling/contract.py:272 // for _i, asset_id in uenumerate(assets): frame_dig 3 frame_dig 2 @@ -1848,10 +1887,10 @@ get_assets_labels_for_header@1: frame_dig 3 pushint 8 // 8 * - // smart_contracts/asset_labeling/contract.py:275 + // smart_contracts/asset_labeling/contract.py:273 // asset = Asset(asset_id.native) extract_uint64 - // smart_contracts/asset_labeling/contract.py:276 + // smart_contracts/asset_labeling/contract.py:274 // if asset in self.assets: itob dup @@ -1859,7 +1898,7 @@ get_assets_labels_for_header@1: box_len bury 1 bz get_assets_labels_else_body@4 - // smart_contracts/asset_labeling/contract.py:277 + // smart_contracts/asset_labeling/contract.py:275 // out.append(self.assets[asset].copy()) frame_dig 0 box_get @@ -1886,7 +1925,7 @@ get_assets_labels_after_if_else@5: b get_assets_labels_for_header@1 get_assets_labels_else_body@4: - // smart_contracts/asset_labeling/contract.py:279 + // smart_contracts/asset_labeling/contract.py:277 // out.append(empty_list()) frame_dig 1 dup @@ -1901,8 +1940,107 @@ get_assets_labels_else_body@4: b get_assets_labels_after_if_else@5 get_assets_labels_after_for@7: - // smart_contracts/asset_labeling/contract.py:280 + // smart_contracts/asset_labeling/contract.py:278 // return out frame_dig 1 frame_bury 0 retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro(asset_id: uint64) -> bytes: +_get_asset_micro: + // smart_contracts/asset_labeling/contract.py:280-282 + // # Batch asset data fetch methods + // @subroutine + // def _get_asset_micro(self, asset_id: UInt64) -> AssetMicro: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:285 + // unit_name=b2str(asset.unit_name), + frame_dig -1 + asset_params_get AssetUnitName + assert // asset exists + // smart_contracts/asset_labeling/contract.py:38 + // return arc4.String(String.from_bytes(b)) + dup + len + itob + extract 6 2 + swap + concat + // smart_contracts/asset_labeling/contract.py:286 + // decimals=arc4.UInt8(asset.decimals), + frame_dig -1 + asset_params_get AssetDecimals + assert // asset exists + itob + dup + bitlen + pushint 8 // 8 + <= + assert // overflow + extract 7 1 + // smart_contracts/asset_labeling/contract.py:284-287 + // return AssetMicro( + // unit_name=b2str(asset.unit_name), + // decimals=arc4.UInt8(asset.decimals), + // ) + pushbytes 0x0003 + swap + concat + swap + concat + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro(asset: uint64) -> bytes: +get_asset_micro: + // smart_contracts/asset_labeling/contract.py:289-290 + // @abimethod(readonly=True) + // def get_asset_micro(self, asset: UInt64) -> AssetMicro: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:291 + // return self._get_asset_micro(asset) + frame_dig -1 + callsub _get_asset_micro + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro(assets: bytes) -> void: +get_assets_micro: + // smart_contracts/asset_labeling/contract.py:293-294 + // @abimethod(readonly=True) + // def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:295 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_micro_for_header@1: + // smart_contracts/asset_labeling/contract.py:295 + // for _i, asset_id in uenumerate(assets): + frame_dig 1 + frame_dig 0 + < + bz get_assets_micro_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + pushint 8 // 8 + * + // smart_contracts/asset_labeling/contract.py:296 + // log(self._get_asset_micro(asset_id.native)) + extract_uint64 + callsub _get_asset_micro + log + intc_0 // 1 + + + frame_bury 1 + b get_assets_micro_for_header@1 + +get_assets_micro_after_for@4: + retsub diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json index 39dc20a..a95c864 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json @@ -1,6 +1,16 @@ { "name": "AssetLabeling", "structs": { + "AssetMicro": [ + { + "name": "unit_name", + "type": "string" + }, + { + "name": "decimals", + "type": "uint8" + } + ], "LabelDescriptor": [ { "name": "name", @@ -289,6 +299,49 @@ "readonly": true, "events": [], "recommendations": {} + }, + { + "name": "get_asset_micro", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "returns": { + "type": "(string,uint8)", + "struct": "AssetMicro" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_micro", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} } ], "arcs": [ @@ -351,93 +404,110 @@ "sourceInfo": [ { "pc": [ - 848, - 1282, - 1301, - 1724 + 896, + 1331, + 1350, + 1773 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ - 215, - 235, - 258, - 282, + 230, + 245, + 265, + 284, 306, - 329, - 353, - 377, - 392, - 415, - 433, - 457 + 330, + 354, + 376, + 400, + 424, + 439, + 461, + 479, + 503 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ - 480 + 2058, + 2071 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 526 ], "errorMessage": "can only call when creating" }, { "pc": [ - 218, - 238, - 261, - 285, + 233, + 248, + 268, + 287, 309, - 332, - 356, - 380, - 395, - 418, - 436, - 460 + 333, + 357, + 379, + 403, + 427, + 442, + 464, + 482, + 506 ], "errorMessage": "can only call when not creating" }, { "pc": [ - 723, - 944 + 770, + 993 ], "errorMessage": "check self.admin exists" }, { "pc": [ - 1531, - 1581, - 1705, - 1716, - 1796, - 1894, - 1942 + 1580, + 1630, + 1754, + 1765, + 1845, + 1943, + 1991 ], "errorMessage": "check self.assets entry exists" }, { "pc": [ - 847, - 883, - 926, - 1158, - 1281, - 1554, - 1760 + 895, + 931, + 974, + 1207, + 1330, + 1603, + 1809 ], "errorMessage": "check self.labels entry exists" }, { "pc": [ - 1025, - 1132, - 1340, - 1365, - 1469 + 1074, + 1181, + 1389, + 1414, + 1518 ], "errorMessage": "check self.operators entry exists" + }, + { + "pc": [ + 2078 + ], + "errorMessage": "overflow" } ], "pcOffsetMethod": "none" @@ -448,11 +518,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUAAIAAAVhZG1pbgQVH3x1CkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAQrMQBnMRtBAWGCDASPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD8Epn8DwjYaAI4MAPQA3ADKALMApACMAHQAXQBFAC0AFgACI0MxGRREMRhENhoBiAaLJwRMULAiQzEZFEQxGEQ2GgEXwDCIBl4nBExQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFcSJDMRkURDEYRDYaAVcCADYaAhfAMIgElCJDMRkURDEYRDYaARfAHIgEcCcETFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiANaIkMxGRREMRhENhoBF8AcNhoCVwIAiALKIkMxGRREMRhENhoBiAHyIkMxGRREMRhENhoBVwIAiAHNJwRMULAiQzEZFEQxGEQ2GgFXAgCIAYMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIASQiQzEZFEQxGEQ2GgEXwByIAQciQzEZQP71MRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAEpSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiTEAIytlRBJAAAQnB7AAiYoBAIj/6yuL/2eJigIAiP/gi/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5mL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjK2VEEkEAAYmL/4gAAYmKAQAxAIv/iAAfIQQTQQAVMQCL/4gAEiUTQQAJIkAABCcHsACJI0L/9IoCASMpSYv+vUUBQAAFIQSMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88ljACJigIAi/+I/2KL/71FAUAAAyiwAIv+vUUBQQBAi/6L/4j/hSUSQAAEJwWwAIv+vkSL/xUWVwYCi/9QIoj9aIv+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnBkxQJwtMUIv+vEiL/ky/Qv/NigIAI0cEKUcCi/+I/uSL/71FAUAAAyiwAIv+vUUBQAADKLAAi/6L/4j/BEmMByUTQQDCiwchBBNBALoiQAADKLAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxVjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0kpSYv+vUUBQAADKLAAi/6I/eSL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBbAAiwFJvkSL/hUWVwYCi/5QIoj72UsBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnBkxQJwtMUIsBSbxITL9C/4mKAgAjRwMpRwKL/r1FAUAAAyiwAIv+iP0dI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90qjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+qmMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9/igEBi/8WSb1FAUEABosAvkRMiSpMiYoBASMqi/8jWSOLA4sCDEEAT4v/VwIAiwOBCAtbFkmMAL1FAUEAIosAvkQnBkxQiwFJI1lMVwIAIk8DiPqkjAGLAyIIjANC/8GLAUkjWUxXAgAigAQAAgAAiPqGjAFC/9+LAYwAiQ==", + "approval": "CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBBUffHUAAgAABWFkbWluCkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAUnBDEAZzEbQQGOgg4Ejw19jgR8GzL2BBfmka4EM9D/3ARyVhbnBPrBzxsEtMULnwSi3SJHBKN96hEEaPGO+gTC7XQ/BKZ/A8IEqu4MYQS2w59oNhoAjg4BEwD7AOkA0wDEAKwAlAB+AGYATgA4ACUAEQACI0MxGRREMRhENhoBiAdEIkMxGRREMRhENhoBF4gHKylMULAiQzEZFEQxGEQ2GgGIBoopTFCwIkMxGRREMRhENhoBF8AwiAZeKUxQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFciJDMRkURDEYRDYaAVcCADYaAhfAMIgElSJDMRkURDEYRDYaARfAHIgEcSlMULAiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIA1wiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIAswiQzEZFEQxGEQ2GgGIAfMiQzEZFEQxGEQ2GgFXAgCIAc4pTFCwIkMxGRREMRhENhoBVwIAiAGFIkMxGRREMRhENhoBVwIANhoCVwIAiAEmIkMxGRREMRhENhoBF8AciAEIIkMxGUD+1jEYFEQiQ4oDAYv9I1lJi/8ITCQLJAhLARZXBgJOAov9JEsCUov/JAuvUIv9FYv9TwNPAlJQi/5QTCQLSSNMiwOLAgxBACOLBEkWVwYCiwGLA0lOBE8CXUmMAUsBWSQICIwEJAiMA0L/1YsAiwFQjACJigQBKkmL/iQLi/wkCyOLBIsDDEEAHIv9iwRJTgJZiwIIFlcGAosBTFCMASQIjARC/9yL/RWMACOMBIsEiwIMQQAci/+LBElOAlmLAAgWVwYCiwFMUIwBJAiMBEL/3Iv8i/4IFlcGAosBUIv9iwOLAFJQi/8Vi/+LAk8CUlCMAIkxACMnBGVEEkAABCcHsACJigEAiP/qJwSL/2eJigIAiP/ei/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5eL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjJwRlRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnB7AAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9hi/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcFsACL/r5Ei/8VFlcGAov/UCKI/WWL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwZMUCcLTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ji/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAwosHIQQTQQC6IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJwmoQQCJIkAABCcKsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiSuMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj8UowDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv90I0L/Q4oBAYv/vUUBQQAFi/++RIkriYoCACNJKkmL/r1FAUAAAyiwAIv+iP3ki/8WSYwBvUUBQQCGiwG9RQFAADghBCUSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+9ZLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kYsDIgiMA0L/zyVC/4SL/hUWVwYCi/5QJwZMUCcLTFCLAUm8SEy/Qv+JigIAI0cDKkcCi/69RQFAAAMosACL/oj9HSOMBYv/FkmMA75EI1kiEkEAR4sDvkRJVwIATCNZREkjWUpZJAhYVwIAi/4SQQAkiwO8SCKMBYsFQAADKLAAi/6+REkkWyIJFlwCi/68SIv+TL+JI4wFQv/dK4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPqmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/f4oBAYv/Fkm9RQFBAAaLAL5ETIkrTImKAQEjK4v/I1kjiwOLAgxBAE+L/1cCAIsDgQgLWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6oYwBiwMiCIwDQv/BiwFJI1lMVwIAIoAEAAIAAIj6g4wBQv/fiwGMAImKAQGL/3EDREkVFlcGAkxQi/9xAUQWSZOBCA5EVwcBgAIAA0xQTFCJigEBi/+I/9CJigEAi/8jWSOLAYsADEEAGYv/VwIAiwFJTgKBCAtbiP+usCIIjAFC/9+J", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts index 47363f9..ada57f4 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[848,1282,1301,1724],"errorMessage":"Index access is out of bounds"},{"pc":[215,235,258,282,306,329,353,377,392,415,433,457],"errorMessage":"OnCompletion is not NoOp"},{"pc":[480],"errorMessage":"can only call when creating"},{"pc":[218,238,261,285,309,332,356,380,395,418,436,460],"errorMessage":"can only call when not creating"},{"pc":[723,944],"errorMessage":"check self.admin exists"},{"pc":[1531,1581,1705,1716,1796,1894,1942],"errorMessage":"check self.assets entry exists"},{"pc":[847,883,926,1158,1281,1554,1760],"errorMessage":"check self.labels entry exists"},{"pc":[1025,1132,1340,1365,1469],"errorMessage":"check self.operators entry exists"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAiIiAweDAwMDAgImFkbWluIiAweDE1MWY3Yzc1ICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NQogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgLy8gbWV0aG9kICJjaGFuZ2VfYWRtaW4oYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhZGRfbGFiZWwoc3RyaW5nLHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWwoc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9sYWJlbChzdHJpbmcpKHN0cmluZyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2xhYmVscyhzdHJpbmdbXSl2b2lkIiwgbWV0aG9kICJhZGRfb3BlcmF0b3JfdG9fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoYWNjb3VudCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X29wZXJhdG9yX2xhYmVscyhhY2NvdW50KXN0cmluZ1tdIiwgbWV0aG9kICJhZGRfbGFiZWxfdG9fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbGFiZWxzKGFzc2V0KXN0cmluZ1tdIiwgbWV0aG9kICJnZXRfYXNzZXRzX2xhYmVscyh1aW50NjRbXSlzdHJpbmdbXVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2CgptYWluX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb25seSgpIC0+IHZvaWQ6CmFkbWluX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4sIFMoIkVSUjpVTkFVVEgiKSkKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5jaGFuZ2VfYWRtaW4obmV3X2FkbWluOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlX2FkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1LTU2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjaGFuZ2VfYWRtaW4oc2VsZiwgbmV3X2FkbWluOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5hZG1pbiA9IG5ld19hZG1pbgogICAgYnl0ZWNfMyAvLyAiYWRtaW4iCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWwoaWQ6IGJ5dGVzLCBuYW1lOiBieXRlcykgLT4gdm9pZDoKYWRkX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwLTYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZywgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBieiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY1LTY5CiAgICAvLyBzZWxmLmxhYmVsc1tpZF0gPSBMYWJlbERlc2NyaXB0b3IoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcobmFtZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMCksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsKGlkOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxLTcyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZW5zdXJlKGlkLmJ5dGVzLmxlbmd0aCA9PSAyLCBTKCJFUlI6TEVOR1RIIikpCiAgICBieXRlYyA4IC8vICJFUlI6TEVOR1RIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzYKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NgogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODIKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0LTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgbG9nX2xhYmVscyhzZWxmLCBpZHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NgogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogbG9nX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBsb2coc2VsZi5sYWJlbHNbbGFiZWxfaWQubmF0aXZlXSkKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgbG9nX2xhYmVsc19mb3JfaGVhZGVyQDEKCmxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIGJ6IGFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk3LTk4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwLTEwMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMS0xMDIKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAtMTAyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTIKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI0CiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI1CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4LTEyOQogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgtMTQwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMy0xMzQKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUwLTE1MQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1My0xNTUKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NS0xNjgKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTcxCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIzLTIyNQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzcKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1LTI1NgogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTctMjU5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OS0yNzIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzkKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgwCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUAAIAAAVhZG1pbgQVH3x1CkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAQrMQBnMRtBAWGCDASPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD8Epn8DwjYaAI4MAPQA3ADKALMApACMAHQAXQBFAC0AFgACI0MxGRREMRhENhoBiAaLJwRMULAiQzEZFEQxGEQ2GgEXwDCIBl4nBExQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFcSJDMRkURDEYRDYaAVcCADYaAhfAMIgElCJDMRkURDEYRDYaARfAHIgEcCcETFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiANaIkMxGRREMRhENhoBF8AcNhoCVwIAiALKIkMxGRREMRhENhoBiAHyIkMxGRREMRhENhoBVwIAiAHNJwRMULAiQzEZFEQxGEQ2GgFXAgCIAYMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIASQiQzEZFEQxGEQ2GgEXwByIAQciQzEZQP71MRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAEpSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiTEAIytlRBJAAAQnB7AAiYoBAIj/6yuL/2eJigIAiP/gi/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5mL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjK2VEEkEAAYmL/4gAAYmKAQAxAIv/iAAfIQQTQQAVMQCL/4gAEiUTQQAJIkAABCcHsACJI0L/9IoCASMpSYv+vUUBQAAFIQSMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88ljACJigIAi/+I/2KL/71FAUAAAyiwAIv+vUUBQQBAi/6L/4j/hSUSQAAEJwWwAIv+vkSL/xUWVwYCi/9QIoj9aIv+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnBkxQJwtMUIv+vEiL/ky/Qv/NigIAI0cEKUcCi/+I/uSL/71FAUAAAyiwAIv+vUUBQAADKLAAi/6L/4j/BEmMByUTQQDCiwchBBNBALoiQAADKLAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxVjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0kpSYv+vUUBQAADKLAAi/6I/eSL/xZJjAG9RQFBAIaLAb1FAUAAOCEEJRJAAAQnBbAAiwFJvkSL/hUWVwYCi/5QIoj72UsBvEi/i/6+REkkWyIIFlwCi/68SIv+TL+JiwG+TElOAowARCNZjAIjjAOLA4sCDEEAKYsAVwIAiwMkC0sBTFlKWSQIWFcCAIv+EkEABYsDQv+RiwMiCIwDQv/PJUL/hIv+FRZXBgKL/lAnBkxQJwtMUIsBSbxITL9C/4mKAgAjRwMpRwKL/r1FAUAAAyiwAIv+iP0dI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMosACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90qjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+qmMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9/igEBi/8WSb1FAUEABosAvkRMiSpMiYoBASMqi/8jWSOLA4sCDEEAT4v/VwIAiwOBCAtbFkmMAL1FAUEAIosAvkQnBkxQiwFJI1lMVwIAIk8DiPqkjAGLAyIIjANC/8GLAUkjWUxXAgAigAQAAgAAiPqGjAFC/9+LAYwAiQ==","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[896,1331,1350,1773],"errorMessage":"Index access is out of bounds"},{"pc":[230,245,265,284,306,330,354,376,400,424,439,461,479,503],"errorMessage":"OnCompletion is not NoOp"},{"pc":[2058,2071],"errorMessage":"asset exists"},{"pc":[526],"errorMessage":"can only call when creating"},{"pc":[233,248,268,287,309,333,357,379,403,427,442,464,482,506],"errorMessage":"can only call when not creating"},{"pc":[770,993],"errorMessage":"check self.admin exists"},{"pc":[1580,1630,1754,1765,1845,1943,1991],"errorMessage":"check self.assets entry exists"},{"pc":[895,931,974,1207,1330,1603,1809],"errorMessage":"check self.labels entry exists"},{"pc":[1074,1181,1389,1414,1518],"errorMessage":"check self.operators entry exists"},{"pc":[2078],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBBUffHUAAgAABWFkbWluCkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAUnBDEAZzEbQQGOgg4Ejw19jgR8GzL2BBfmka4EM9D/3ARyVhbnBPrBzxsEtMULnwSi3SJHBKN96hEEaPGO+gTC7XQ/BKZ/A8IEqu4MYQS2w59oNhoAjg4BEwD7AOkA0wDEAKwAlAB+AGYATgA4ACUAEQACI0MxGRREMRhENhoBiAdEIkMxGRREMRhENhoBF4gHKylMULAiQzEZFEQxGEQ2GgGIBoopTFCwIkMxGRREMRhENhoBF8AwiAZeKUxQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFciJDMRkURDEYRDYaAVcCADYaAhfAMIgElSJDMRkURDEYRDYaARfAHIgEcSlMULAiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIA1wiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIAswiQzEZFEQxGEQ2GgGIAfMiQzEZFEQxGEQ2GgFXAgCIAc4pTFCwIkMxGRREMRhENhoBVwIAiAGFIkMxGRREMRhENhoBVwIANhoCVwIAiAEmIkMxGRREMRhENhoBF8AciAEIIkMxGUD+1jEYFEQiQ4oDAYv9I1lJi/8ITCQLJAhLARZXBgJOAov9JEsCUov/JAuvUIv9FYv9TwNPAlJQi/5QTCQLSSNMiwOLAgxBACOLBEkWVwYCiwGLA0lOBE8CXUmMAUsBWSQICIwEJAiMA0L/1YsAiwFQjACJigQBKkmL/iQLi/wkCyOLBIsDDEEAHIv9iwRJTgJZiwIIFlcGAosBTFCMASQIjARC/9yL/RWMACOMBIsEiwIMQQAci/+LBElOAlmLAAgWVwYCiwFMUIwBJAiMBEL/3Iv8i/4IFlcGAosBUIv9iwOLAFJQi/8Vi/+LAk8CUlCMAIkxACMnBGVEEkAABCcHsACJigEAiP/qJwSL/2eJigIAiP/ei/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5eL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjJwRlRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnB7AAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9hi/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcFsACL/r5Ei/8VFlcGAov/UCKI/WWL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwZMUCcLTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ji/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAwosHIQQTQQC6IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJwmoQQCJIkAABCcKsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiSuMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj8UowDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv90I0L/Q4oBAYv/vUUBQQAFi/++RIkriYoCACNJKkmL/r1FAUAAAyiwAIv+iP3ki/8WSYwBvUUBQQCGiwG9RQFAADghBCUSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+9ZLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kYsDIgiMA0L/zyVC/4SL/hUWVwYCi/5QJwZMUCcLTFCLAUm8SEy/Qv+JigIAI0cDKkcCi/69RQFAAAMosACL/oj9HSOMBYv/FkmMA75EI1kiEkEAR4sDvkRJVwIATCNZREkjWUpZJAhYVwIAi/4SQQAkiwO8SCKMBYsFQAADKLAAi/6+REkkWyIJFlwCi/68SIv+TL+JI4wFQv/dK4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPqmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/f4oBAYv/Fkm9RQFBAAaLAL5ETIkrTImKAQEjK4v/I1kjiwOLAgxBAE+L/1cCAIsDgQgLWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6oYwBiwMiCIwDQv/BiwFJI1lMVwIAIoAEAAIAAIj6g4wBQv/fiwGMAImKAQGL/3EDREkVFlcGAkxQi/9xAUQWSZOBCA5EVwcBgAIAA0xQTFCJigEBi/+I/9CJigEAi/8jWSOLAYsADEEAGYv/VwIAiwFJTgKBCAtbiP+usCIIjAFC/9+J","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -65,6 +65,19 @@ export type Expand = T extends (...args: infer A) => infer R // Type definitions for ARC-56 structs +export type AssetMicro = { + unitName: string, + decimals: number +} + + +/** + * Converts the ABI tuple representation of a AssetMicro to the struct representation + */ +export function AssetMicroFromTuple(abiTuple: [string, number]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicro, APP_SPEC.structs) as AssetMicro +} + export type LabelDescriptor = { name: string, numAssets: bigint, @@ -128,6 +141,12 @@ export type AssetLabelingArgs = { 'get_assets_labels(uint64[])string[][]': { assets: bigint[] | number[] } + 'get_asset_micro(uint64)(string,uint8)': { + asset: bigint | number + } + 'get_assets_micro(uint64[])void': { + assets: bigint[] | number[] + } } /** * The tuple representation of the arguments for each method @@ -145,6 +164,8 @@ export type AssetLabelingArgs = { 'remove_label_from_asset(string,asset)void': [label: string, asset: bigint] 'get_asset_labels(asset)string[]': [asset: bigint] 'get_assets_labels(uint64[])string[][]': [assets: bigint[] | number[]] + 'get_asset_micro(uint64)(string,uint8)': [asset: bigint | number] + 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] } } @@ -164,6 +185,8 @@ export type AssetLabelingReturns = { 'remove_label_from_asset(string,asset)void': void 'get_asset_labels(asset)string[]': string[] 'get_assets_labels(uint64[])string[][]': string[][] + 'get_asset_micro(uint64)(string,uint8)': AssetMicro + 'get_assets_micro(uint64[])void': void } /** @@ -234,6 +257,16 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_assets_labels(uint64[])string[][]'] returns: AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] }> + & Record<'get_asset_micro(uint64)(string,uint8)' | 'get_asset_micro', { + argsObj: AssetLabelingArgs['obj']['get_asset_micro(uint64)(string,uint8)'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_micro(uint64)(string,uint8)'] + returns: AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] + }> + & Record<'get_assets_micro(uint64[])void' | 'get_assets_micro', { + argsObj: AssetLabelingArgs['obj']['get_assets_micro(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_micro(uint64[])void'] + returns: AssetLabelingReturns['get_assets_micro(uint64[])void'] + }> /** * Defines the shape of the state of the application. */ @@ -469,6 +502,32 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.assets], } } + /** + * Constructs a no op call for the get_asset_micro(uint64)(string,uint8) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_micro(uint64)(string,uint8)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_micro(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_micro(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } } /** @@ -839,6 +898,30 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + }, + } /** @@ -985,6 +1068,30 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + }, + } /** @@ -1143,6 +1250,32 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_labels(uint64[])string[][]'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro(uint64[])void'])} + }, + } /** @@ -1220,6 +1353,32 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetMicro(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsMicro(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_micro(uint64[])void'] + } + /** * Methods to access state for the current AssetLabeling app */ @@ -1398,6 +1557,22 @@ export class AssetLabelingClient { resultMappers.push((v) => client.decodeReturnValue('get_assets_labels(uint64[])string[][]', v)) return this }, + /** + * Add a get_asset_micro(uint64)(string,uint8) method call against the AssetLabeling contract + */ + getAssetMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetMicro(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_micro(uint64)(string,uint8)', v)) + return this + }, + /** + * Add a get_assets_micro(uint64[])void method call against the AssetLabeling contract + */ + getAssetsMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsMicro(params))) + resultMappers.push(undefined) + return this + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -1541,6 +1716,24 @@ export type AssetLabelingComposer = { */ getAssetsLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] | undefined]> + /** + * Calls the get_asset_micro(uint64)(string,uint8) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] | undefined]> + + /** + * Calls the get_assets_micro(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro(uint64[])void'] | undefined]> + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index 19c6348..d804ba7 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -3,6 +3,7 @@ ARC4Contract, Asset, BoxMap, + Bytes, String, Txn, UInt64, @@ -14,9 +15,7 @@ ) from algopy.arc4 import abimethod -S = String - -LabelList = arc4.DynamicArray[arc4.String] +from .types import AssetMicro, LabelDescriptor, LabelList, S NOT_FOUND_KEY = 2**32 # magic constant for "list not found" NOT_FOUND_VALUE = 2**32 - 1 # magic constant for "not found in list" @@ -34,10 +33,9 @@ def empty_list() -> LabelList: return arc4.DynamicArray[arc4.String]() -class LabelDescriptor(arc4.Struct): - name: arc4.String - num_assets: arc4.UInt64 - num_operators: arc4.UInt64 +@subroutine +def b2str(b: Bytes) -> arc4.String: + return arc4.String(String.from_bytes(b)) class AssetLabeling(ARC4Contract): @@ -278,3 +276,21 @@ def get_assets_labels( else: out.append(empty_list()) return out + + # Batch asset data fetch methods + @subroutine + def _get_asset_micro(self, asset_id: UInt64) -> AssetMicro: + asset = Asset(asset_id) + return AssetMicro( + unit_name=b2str(asset.unit_name), + decimals=arc4.UInt8(asset.decimals), + ) + + @abimethod(readonly=True) + def get_asset_micro(self, asset: UInt64) -> AssetMicro: + return self._get_asset_micro(asset) + + @abimethod(readonly=True) + def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + for _i, asset_id in uenumerate(assets): + log(self._get_asset_micro(asset_id.native)) diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py new file mode 100644 index 0000000..735b5cf --- /dev/null +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py @@ -0,0 +1,16 @@ +from algopy import String, arc4 + +S = String + +LabelList = arc4.DynamicArray[arc4.String] + + +class LabelDescriptor(arc4.Struct): + name: arc4.String + num_assets: arc4.UInt64 + num_operators: arc4.UInt64 + + +class AssetMicro(arc4.Struct): + unit_name: arc4.String + decimals: arc4.UInt8 From 522fcc83fa7f083a3bc8ce86e9a3a8fc27933492 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 18:15:17 +0300 Subject: [PATCH 07/15] concurrency --- projects/abel-sdk-v2/src/index.ts | 43 ++++++++++++++++++++----------- projects/abel-sdk-v2/src/types.ts | 2 ++ projects/abel-sdk-v2/src/util.ts | 26 +++++++++++++++++++ 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index 6e6398b..61c105d 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -2,6 +2,7 @@ import { TransactionSignerAccount } from "@algorandfoundation/algokit-utils/type import { decodeAddress, decodeUint64, encodeAddress, encodeUint64, makeEmptyTransactionSigner } from "algosdk"; import { AlgorandClient } from "@algorandfoundation/algokit-utils"; import { BoxName } from "@algorandfoundation/algokit-utils/types/app"; +import pMap from "p-map"; import { AssetLabelingClient, AssetLabelingFactory, @@ -9,8 +10,8 @@ import { AssetMicroFromTuple, LabelDescriptorFromTuple as LabelDescriptorBoxValueFromTuple, } from "./generated/abel-contract-client.js"; -import { AnyFn, LabelDescriptor } from "./types.js"; -import { wrapErrors } from "./util.js"; +import { AnyFn, FirstArgument, LabelDescriptor } from "./types.js"; +import { chunk, mergeMapsArr, wrapErrors } from "./util.js"; export * from "./types.js"; export { AssetLabelingClient, AssetLabelingFactory }; @@ -28,17 +29,20 @@ export class AbelSDK { readClient: AssetLabelingClient; writeClient: AssetLabelingClient | undefined; writeAccount?: TransactionSignerAccount | undefined; + private concurrency: number = 2; constructor({ algorand, appId, readAccount = DEFAULT_READ_ACCOUNT, writeAccount, + concurrency, }: { algorand: AlgorandClient; appId: bigint; writeAccount?: TransactionSignerAccount; readAccount?: string; + concurrency?: number; }) { // Client used for read queries. Sender can be any funded address. // Default read is the A7N.. fee sink which is funded on all public ALGO networks incl. localnet @@ -57,6 +61,10 @@ export class AbelSDK { }); this.writeAccount = writeAccount; } + + if (concurrency !== undefined) { + this.concurrency = concurrency; + } } get appId() { @@ -126,12 +134,7 @@ export class AbelSDK { async getOperatorLabels(operator: string): Promise { const { returns: [operatorLabels], - } = await wrapErrors( - this.readClient - .newGroup() - .getOperatorLabels({ args: { operator } }) - .simulate(SIMULATE_PARAMS) - ); + } = await wrapErrors(this.readClient.newGroup().getOperatorLabels({ args: { operator } }).simulate(SIMULATE_PARAMS)); return operatorLabels!; } @@ -248,7 +251,11 @@ export class AbelSDK { } /* Batch fetch asset views */ - async getAssetsMicro(assetIds: bigint[]): Promise> { + + getAssetsMicro = async (assetIds: bigint[]): Promise> => { + const METHOD_MAX = 128; + if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsMicro, assetIds, METHOD_MAX); + const { confirmations } = await wrapErrors( this.readClient .newGroup() @@ -257,12 +264,8 @@ export class AbelSDK { ); const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetMicroFromTuple, "get_asset_micro"); - - return new Map(assetValues.map((descriptorValue, idx) => { - const id = assetIds[idx]; - return [id, { id, ...descriptorValue }] - })); - } + return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); + }; /* Utils */ @@ -297,4 +300,14 @@ export class AbelSDK { throw new Error(`A transaction operation was issued on a read-only client`); } } + + /* + * pMap batcher, merge maps after + */ + async batchCall(method: T, args: FirstArgument, methodMax: number): Promise> { + const chunked = chunk(args, methodMax); + const res: ReturnType[] = await pMap(chunked, (arg) => method(arg), { concurrency: this.concurrency }); + // @ts-ignore + return mergeMapsArr(res); + } } diff --git a/projects/abel-sdk-v2/src/types.ts b/projects/abel-sdk-v2/src/types.ts index 9006516..5f47fbd 100644 --- a/projects/abel-sdk-v2/src/types.ts +++ b/projects/abel-sdk-v2/src/types.ts @@ -12,3 +12,5 @@ export type AnyFn = (...args: any[]) => any; export interface AssetMicro extends AssetMicroValue { id: bigint; } + +export type FirstArgument any> = T extends (arg1: infer U, ...args: any[]) => any ? U : never; diff --git a/projects/abel-sdk-v2/src/util.ts b/projects/abel-sdk-v2/src/util.ts index e75bb40..a1dd069 100644 --- a/projects/abel-sdk-v2/src/util.ts +++ b/projects/abel-sdk-v2/src/util.ts @@ -13,3 +13,29 @@ export async function wrapErrors(a: T) { throw e; } } + +export function chunk(array: T[], chunkSize: number): T[][] { + if (chunkSize <= 0) { + throw new Error("Chunk size must be greater than 0"); + } + + const result: T[][] = []; + + for (let i = 0; i < array.length; i += chunkSize) { + result.push(array.slice(i, i + chunkSize)); + } + + return result; +} + +export function mergeMapsArr(maps: Map[]): Map { + const mergedMap = new Map(maps[0]); + + for (const map of maps.slice(1)) { + map.forEach((value, key) => { + mergedMap.set(key, value); // Overwrites or adds new key-value pairs + }); + } + + return mergedMap; +} From fdf719f3f5772a429258b65a651cb5e53fac2168 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 18:15:24 +0300 Subject: [PATCH 08/15] utils --- projects/abel-sdk-v2/cli/create-assets.ts | 15 ++++++++++----- projects/abel-sdk-v2/cli/get-micro.ts | 13 +++++++++---- projects/abel-sdk-v2/package-lock.json | 21 ++++++++++++++++++++- projects/abel-sdk-v2/package.json | 3 ++- projects/abel-sdk-v2/src/index.ts | 2 ++ 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/projects/abel-sdk-v2/cli/create-assets.ts b/projects/abel-sdk-v2/cli/create-assets.ts index 307dd92..e5544a5 100644 --- a/projects/abel-sdk-v2/cli/create-assets.ts +++ b/projects/abel-sdk-v2/cli/create-assets.ts @@ -8,7 +8,7 @@ const algorand = AlgorandClient.fromEnvironment(); const deployer = await algorand.account.fromEnvironment("DEPLOYER"); const { "last-round": lr } = await algorand.client.algod.status().do(); -const { +let { block: { tc }, } = await algorand.client.algod.block(lr).do(); @@ -23,10 +23,15 @@ function addAsset(composer: TransactionComposer, times) { sender: deployer.addr, }); } + tc += times; return composer; } -let composer = algorand.newGroup(); -addAsset(composer, 16); -const { txIds } = await composer.send(); -console.log(txIds); +const num = Math.ceil(parseInt(process.argv[2] ?? "256", 10) / 16); + +for(let i=0; i start+BigInt(i)) -console.log({ assets }) -console.log(await sdk.getAssetsMicro(assets)); +const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) +const startTs = Date.now(); +const assets = await sdk.getAssetsMicro(aids); +const endTs = Date.now() +console.log(...assets.values()); +console.log(endTs - startTs, 'ms'); +console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/package-lock.json b/projects/abel-sdk-v2/package-lock.json index 73730a9..bb07af8 100644 --- a/projects/abel-sdk-v2/package-lock.json +++ b/projects/abel-sdk-v2/package-lock.json @@ -16,7 +16,8 @@ }, "peerDependencies": { "@algorandfoundation/algokit-utils": "^7.0.2", - "algosdk": "^2.8.0" + "algosdk": "^2.8.0", + "p-map": "^7.0.3" } }, "node_modules/@algorandfoundation/algokit-client-generator": { @@ -746,6 +747,18 @@ "node": "*" } }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1199,6 +1212,12 @@ "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", "dev": true }, + "p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "peer": true + }, "resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", diff --git a/projects/abel-sdk-v2/package.json b/projects/abel-sdk-v2/package.json index e34e9ce..db97ca8 100644 --- a/projects/abel-sdk-v2/package.json +++ b/projects/abel-sdk-v2/package.json @@ -42,7 +42,8 @@ }, "peerDependencies": { "@algorandfoundation/algokit-utils": "^7.0.2", - "algosdk": "^2.8.0" + "algosdk": "^2.8.0", + "p-map": "^7.0.3" }, "type": "module" } diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index 61c105d..9a568e7 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -303,6 +303,8 @@ export class AbelSDK { /* * pMap batcher, merge maps after + * + * decorator pattern instead would be nice but ... eh */ async batchCall(method: T, args: FirstArgument, methodMax: number): Promise> { const chunked = chunk(args, methodMax); From a2982d71e8f69bba38c9f7602ea8713a8435a968 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 18:31:04 +0300 Subject: [PATCH 09/15] assets micro+labels view --- .../artifacts/AssetLabeling.arc32.json | 59 +- projects/abel-sdk-v2/cli/.appid | 2 +- projects/abel-sdk-v2/cli/create.ts | 30 +- projects/abel-sdk-v2/cli/get-micro-labels.ts | 44 + projects/abel-sdk-v2/cli/get-micro.ts | 2 +- projects/abel-sdk-v2/cli/label-asset.ts | 38 + projects/abel-sdk-v2/cli/state.ts | 48 + projects/abel-sdk-v2/cli/unlabel-asset.ts | 38 + .../src/generated/abel-contract-client.ts | 196 +- projects/abel-sdk-v2/src/index.ts | 17 + .../AssetLabeling.approval.puya.map | 14370 ---------------- .../AssetLabeling.approval.teal | 2046 --- .../asset_labeling/AssetLabeling.arc56.json | 538 - .../AssetLabeling.clear.puya.map | 25 - .../asset_labeling/AssetLabeling.clear.teal | 7 - .../asset_labeling/AssetLabelingClient.ts | 1770 -- .../asset_labeling/contract.py | 30 +- .../smart_contracts/asset_labeling/types.py | 6 + 18 files changed, 490 insertions(+), 18776 deletions(-) create mode 100644 projects/abel-sdk-v2/cli/get-micro-labels.ts create mode 100644 projects/abel-sdk-v2/cli/label-asset.ts create mode 100644 projects/abel-sdk-v2/cli/state.ts create mode 100644 projects/abel-sdk-v2/cli/unlabel-asset.ts delete mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map delete mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal delete mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json delete mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map delete mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal delete mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts diff --git a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json index 4cc3d7e..28f50b8 100644 --- a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json +++ b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json @@ -110,10 +110,41 @@ "call_config": { "no_op": "CALL" } + }, + "get_asset_micro_labels(uint64)(string,uint8,string[])": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetMicroLabels", + "elements": [ + [ + "unit_name", + "string" + ], + [ + "decimals", + "uint8" + ], + [ + "labels", + "string[]" + ] + ] + } + } + }, + "get_assets_micro_labels(uint64[])void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1IDB4MDAwMCAiIiAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjEKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IDB4NjM1YmUzNjIgMHg3MDkzYjEwZCAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJsb2dfbGFiZWxzKHN0cmluZ1tdKXZvaWQiLCBtZXRob2QgImFkZF9vcGVyYXRvcl90b19sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfb3BlcmF0b3JfbGFiZWxzKGFjY291bnQpc3RyaW5nW10iLCBtZXRob2QgImFkZF9sYWJlbF90b19hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9sYWJlbHMoYXNzZXQpc3RyaW5nW10iLCBtZXRob2QgImdldF9hc3NldHNfbGFiZWxzKHVpbnQ2NFtdKXN0cmluZ1tdW10iLCBtZXRob2QgImdldF9hc3NldF9taWNybyh1aW50NjQpKHN0cmluZyx1aW50OCkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm8odWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyh1aW50NjQpKHN0cmluZyx1aW50OCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm9fbGFiZWxzKHVpbnQ2NFtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1IG1haW5fYWRkX2xhYmVsX3JvdXRlQDYgbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANyBtYWluX2dldF9sYWJlbF9yb3V0ZUA4IG1haW5fbG9nX2xhYmVsc19yb3V0ZUA5IG1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwIG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTEgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1IG1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTYgbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTcgbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4IG1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOSBtYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwCgptYWluX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNybwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWljcm8KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYtMzcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29ubHkoKSAtPiB2b2lkOgphZG1pbl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuY2hhbmdlX2FkbWluKG5ld19hZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmNoYW5nZV9hZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1My01NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgY2hhbmdlX2FkbWluKHNlbGYsIG5ld19hZG1pbjogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW4gPSBuZXdfYWRtaW4KICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsKGlkOiBieXRlcywgbmFtZTogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OC01OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcsIG5hbWU6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjEKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2My02NwogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OS03MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzIKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgYnl0ZWMgMTAgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBkZWwgc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2xhYmVsKGlkOiBieXRlcykgLT4gYnl0ZXM6CmdldF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBMYWJlbERlc2NyaXB0b3I6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyByZXR1cm4gc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmxvZ19sYWJlbHMoaWRzOiBieXRlcykgLT4gdm9pZDoKbG9nX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGxvZ19sYWJlbHMoc2VsZiwgaWRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKbG9nX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gbG9nKHNlbGYubGFiZWxzW2xhYmVsX2lkLm5hdGl2ZV0pCiAgICBleHRyYWN0IDIgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGxvZ19sYWJlbHNfZm9yX2hlYWRlckAxCgpsb2dfbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkbWluX29yX29wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODktOTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkyCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTMKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NS05NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBvcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OS0xMDAKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OC0xMDAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNC0xMDUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjEtMTIyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjYtMTI3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxLTEzMgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MS0xNDIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Mi0xNTMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3LTE1OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzLTE2NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMtMTc2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Mi0xODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYtMTg3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4LTE5OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5LTIyMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjEtMjIzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNi0yMTcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjYtMjI3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NS0yNTcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxLTI0MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MC0yNjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3LTI3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODktMjkyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OC0yOTkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDUtMzA2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBwdXNoYnl0ZXMgMHgwMDA1CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNAogICAgLy8gYW0ubGFiZWxzID0gc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUKICAgIC8vIHJldHVybiBhbQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNy0zMTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIzCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -345,6 +376,32 @@ "returns": { "type": "void" } + }, + { + "name": "get_asset_micro_labels", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "readonly": true, + "returns": { + "type": "(string,uint8,string[])" + } + }, + { + "name": "get_assets_micro_labels", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "readonly": true, + "returns": { + "type": "void" + } } ], "networks": {} diff --git a/projects/abel-sdk-v2/cli/.appid b/projects/abel-sdk-v2/cli/.appid index fef8095..f68ae3d 100644 --- a/projects/abel-sdk-v2/cli/.appid +++ b/projects/abel-sdk-v2/cli/.appid @@ -1 +1 @@ -4936 \ No newline at end of file +5104 \ No newline at end of file diff --git a/projects/abel-sdk-v2/cli/create.ts b/projects/abel-sdk-v2/cli/create.ts index 8987ea0..db71440 100644 --- a/projects/abel-sdk-v2/cli/create.ts +++ b/projects/abel-sdk-v2/cli/create.ts @@ -81,18 +81,18 @@ console.log(await sdk.getAssetsLabels([3832n, ASSET_ID])) await logAllState(); -if (process.env.STOP) - process.exit(1); - - -console.log("removing label from asset"); -await sdk.removeLabelFromAsset(ASSET_ID, LABEL_ID); - -console.log(await sdk.getLabelDescriptors(["pv"])); - -console.log("removing operator from label"); -await sdk.removeOperatorFromLabel(operator, LABEL_ID); - -console.log("removing operator from label"); -await sdk.removeLabel(LABEL_ID); - +// if (process.env.STOP) +// process.exit(1); +// +// +// console.log("removing label from asset"); +// await sdk.removeLabelFromAsset(ASSET_ID, LABEL_ID); +// +// console.log(await sdk.getLabelDescriptors(["pv"])); +// +// console.log("removing operator from label"); +// await sdk.removeOperatorFromLabel(operator, LABEL_ID); +// +// console.log("removing operator from label"); +// await sdk.removeLabel(LABEL_ID); +// diff --git a/projects/abel-sdk-v2/cli/get-micro-labels.ts b/projects/abel-sdk-v2/cli/get-micro-labels.ts new file mode 100644 index 0000000..8559779 --- /dev/null +++ b/projects/abel-sdk-v2/cli/get-micro-labels.ts @@ -0,0 +1,44 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +const start = BigInt(process.argv[2]) +const len = parseInt(process.argv[3], 10) +const concurrency = parseInt(process.argv[4] ?? "5", 10) + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); + +const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) +const startTs = Date.now(); +const assets = await sdk.getAssetsMicroLabels(aids); +const endTs = Date.now() + +console.log(...assets.values()); +console.log(endTs - startTs, 'ms'); +console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/get-micro.ts b/projects/abel-sdk-v2/cli/get-micro.ts index f87ceb6..0ea55c5 100644 --- a/projects/abel-sdk-v2/cli/get-micro.ts +++ b/projects/abel-sdk-v2/cli/get-micro.ts @@ -36,7 +36,7 @@ const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency } const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) const startTs = Date.now(); -const assets = await sdk.getAssetsMicro(aids); +const assets = await sdk.getAssetMicro(aids); const endTs = Date.now() console.log(...assets.values()); console.log(endTs - startTs, 'ms'); diff --git a/projects/abel-sdk-v2/cli/label-asset.ts b/projects/abel-sdk-v2/cli/label-asset.ts new file mode 100644 index 0000000..5b1d355 --- /dev/null +++ b/projects/abel-sdk-v2/cli/label-asset.ts @@ -0,0 +1,38 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, }); + +const assetId = BigInt(process.argv[2] ?? "1002") +const label = process.argv[3] ?? "pv" + +const { txIds } = await sdk.addLabelToAsset(assetId, label); diff --git a/projects/abel-sdk-v2/cli/state.ts b/projects/abel-sdk-v2/cli/state.ts new file mode 100644 index 0000000..56c9e59 --- /dev/null +++ b/projects/abel-sdk-v2/cli/state.ts @@ -0,0 +1,48 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, }); + +async function logAllState() { + const labels: string[] = await sdk.getAllLabels(); + const operators: string[] = await sdk.getAllOperators(); + const assets: bigint[] = await sdk.getAllAssetIDs(); + + const labelDescriptors = await sdk.getLabelDescriptors(labels); + const operatorLabels = await Promise.all(operators.map((o) => sdk.getOperatorLabels(o))); + const assetLabels = await sdk.getAssetsLabels(assets); + + console.dir({ labels: labelDescriptors, operators: [operators, operatorLabels], assetLabels }); +} + + +logAllState() diff --git a/projects/abel-sdk-v2/cli/unlabel-asset.ts b/projects/abel-sdk-v2/cli/unlabel-asset.ts new file mode 100644 index 0000000..d506a21 --- /dev/null +++ b/projects/abel-sdk-v2/cli/unlabel-asset.ts @@ -0,0 +1,38 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, }); + +const assetId = BigInt(process.argv[2] ?? "1002") +const label = process.argv[3] ?? "pv" + +const { txIds } = await sdk.removeLabelFromAsset(assetId, label); diff --git a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts index 19565b8..2b0f22c 100644 --- a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts +++ b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro_labels","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1IDB4MDAwMCAiIiAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjEKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IDB4NjM1YmUzNjIgMHg3MDkzYjEwZCAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJsb2dfbGFiZWxzKHN0cmluZ1tdKXZvaWQiLCBtZXRob2QgImFkZF9vcGVyYXRvcl90b19sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfb3BlcmF0b3JfbGFiZWxzKGFjY291bnQpc3RyaW5nW10iLCBtZXRob2QgImFkZF9sYWJlbF90b19hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9sYWJlbHMoYXNzZXQpc3RyaW5nW10iLCBtZXRob2QgImdldF9hc3NldHNfbGFiZWxzKHVpbnQ2NFtdKXN0cmluZ1tdW10iLCBtZXRob2QgImdldF9hc3NldF9taWNybyh1aW50NjQpKHN0cmluZyx1aW50OCkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm8odWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyh1aW50NjQpKHN0cmluZyx1aW50OCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm9fbGFiZWxzKHVpbnQ2NFtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1IG1haW5fYWRkX2xhYmVsX3JvdXRlQDYgbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANyBtYWluX2dldF9sYWJlbF9yb3V0ZUA4IG1haW5fbG9nX2xhYmVsc19yb3V0ZUA5IG1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwIG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTEgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1IG1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTYgbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTcgbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4IG1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOSBtYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwCgptYWluX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNybwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWljcm8KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYtMzcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29ubHkoKSAtPiB2b2lkOgphZG1pbl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuY2hhbmdlX2FkbWluKG5ld19hZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmNoYW5nZV9hZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1My01NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgY2hhbmdlX2FkbWluKHNlbGYsIG5ld19hZG1pbjogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW4gPSBuZXdfYWRtaW4KICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsKGlkOiBieXRlcywgbmFtZTogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OC01OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcsIG5hbWU6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjEKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2My02NwogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OS03MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzIKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgYnl0ZWMgMTAgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBkZWwgc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2xhYmVsKGlkOiBieXRlcykgLT4gYnl0ZXM6CmdldF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBMYWJlbERlc2NyaXB0b3I6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyByZXR1cm4gc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmxvZ19sYWJlbHMoaWRzOiBieXRlcykgLT4gdm9pZDoKbG9nX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGxvZ19sYWJlbHMoc2VsZiwgaWRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKbG9nX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gbG9nKHNlbGYubGFiZWxzW2xhYmVsX2lkLm5hdGl2ZV0pCiAgICBleHRyYWN0IDIgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGxvZ19sYWJlbHNfZm9yX2hlYWRlckAxCgpsb2dfbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkbWluX29yX29wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODktOTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkyCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTMKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NS05NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBvcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OS0xMDAKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OC0xMDAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNC0xMDUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjEtMTIyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjYtMTI3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxLTEzMgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MS0xNDIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Mi0xNTMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3LTE1OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzLTE2NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMtMTc2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Mi0xODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYtMTg3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4LTE5OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5LTIyMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjEtMjIzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNi0yMTcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjYtMjI3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NS0yNTcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxLTI0MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MC0yNjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3LTI3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODktMjkyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OC0yOTkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDUtMzA2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBwdXNoYnl0ZXMgMHgwMDA1CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNAogICAgLy8gYW0ubGFiZWxzID0gc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUKICAgIC8vIHJldHVybiBhbQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNy0zMTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIzCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract /** * A state record containing binary data @@ -92,6 +92,20 @@ export function AssetMicroFromTuple(abiTuple: [string, number]) { return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicro, APP_SPEC.structs) as AssetMicro } +export type AssetMicroLabels = { + unitName: string, + decimals: number, + labels: string[] +} + + +/** + * Converts the ABI tuple representation of a AssetMicroLabels to the struct representation + */ +export function AssetMicroLabelsFromTuple(abiTuple: [string, number, string[]]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicroLabels, APP_SPEC.structs) as AssetMicroLabels +} + /** * The argument types for the AssetLabeling contract */ @@ -147,6 +161,12 @@ export type AssetLabelingArgs = { 'get_assets_micro(uint64[])void': { assets: bigint[] | number[] } + 'get_asset_micro_labels(uint64)(string,uint8,string[])': { + asset: bigint | number + } + 'get_assets_micro_labels(uint64[])void': { + assets: bigint[] | number[] + } } /** * The tuple representation of the arguments for each method @@ -166,6 +186,8 @@ export type AssetLabelingArgs = { 'get_assets_labels(uint64[])string[][]': [assets: bigint[] | number[]] 'get_asset_micro(uint64)(string,uint8)': [asset: bigint | number] 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_micro_labels(uint64)(string,uint8,string[])': [asset: bigint | number] + 'get_assets_micro_labels(uint64[])void': [assets: bigint[] | number[]] } } @@ -187,6 +209,8 @@ export type AssetLabelingReturns = { 'get_assets_labels(uint64[])string[][]': string[][] 'get_asset_micro(uint64)(string,uint8)': AssetMicro 'get_assets_micro(uint64[])void': void + 'get_asset_micro_labels(uint64)(string,uint8,string[])': AssetMicroLabels + 'get_assets_micro_labels(uint64[])void': void } /** @@ -267,6 +291,16 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_assets_micro(uint64[])void'] returns: AssetLabelingReturns['get_assets_micro(uint64[])void'] }> + & Record<'get_asset_micro_labels(uint64)(string,uint8,string[])' | 'get_asset_micro_labels', { + argsObj: AssetLabelingArgs['obj']['get_asset_micro_labels(uint64)(string,uint8,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_micro_labels(uint64)(string,uint8,string[])'] + returns: AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'] + }> + & Record<'get_assets_micro_labels(uint64[])void' | 'get_assets_micro_labels', { + argsObj: AssetLabelingArgs['obj']['get_assets_micro_labels(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_micro_labels(uint64[])void'] + returns: AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] + }> /** * Defines the shape of the state of the application. */ @@ -515,6 +549,32 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.assets], } } + /** + * Constructs a no op call for the get_asset_micro_labels(uint64)(string,uint8,string[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetMicroLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_micro_labels(uint64)(string,uint8,string[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_micro_labels(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsMicroLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_micro_labels(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } } /** @@ -909,6 +969,30 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicro(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + }, + } /** @@ -1079,6 +1163,30 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicro(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + }, + } /** @@ -1263,6 +1371,32 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro(uint64[])void'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetMicroLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsMicroLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro_labels(uint64[])void'])} + }, + } /** @@ -1366,6 +1500,32 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_assets_micro(uint64[])void'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetMicroLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsMicroLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] + } + /** * Methods to access state for the current AssetLabeling app */ @@ -1508,6 +1668,22 @@ export class AssetLabelingClient { resultMappers.push(undefined) return this }, + /** + * Add a get_asset_micro_labels(uint64)(string,uint8,string[]) method call against the AssetLabeling contract + */ + getAssetMicroLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetMicroLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_micro_labels(uint64)(string,uint8,string[])', v)) + return this + }, + /** + * Add a get_assets_micro_labels(uint64[])void method call against the AssetLabeling contract + */ + getAssetsMicroLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsMicroLabels(params))) + resultMappers.push(undefined) + return this + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -1669,6 +1845,24 @@ export type AssetLabelingComposer = { */ getAssetsMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro(uint64[])void'] | undefined]> + /** + * Calls the get_asset_micro_labels(uint64)(string,uint8,string[]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'] | undefined]> + + /** + * Calls the get_assets_micro_labels(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] | undefined]> + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index 9a568e7..dc2c185 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -8,6 +8,7 @@ import { AssetLabelingFactory, AssetMicro, AssetMicroFromTuple, + AssetMicroLabelsFromTuple, LabelDescriptorFromTuple as LabelDescriptorBoxValueFromTuple, } from "./generated/abel-contract-client.js"; import { AnyFn, FirstArgument, LabelDescriptor } from "./types.js"; @@ -267,6 +268,22 @@ export class AbelSDK { return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); }; + + getAssetsMicroLabels = async (assetIds: bigint[]): Promise> => { + const METHOD_MAX = 64; + if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsMicroLabels, assetIds, METHOD_MAX); + + const { confirmations } = await wrapErrors( + this.readClient + .newGroup() + .getAssetsMicroLabels({ args: { assets: assetIds } }) + .simulate(SIMULATE_PARAMS) + ); + + const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetMicroLabelsFromTuple, "get_asset_micro_labels"); + return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); + }; + /* Utils */ private async getBoxesByLength(length: number): Promise { diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map deleted file mode 100644 index 7a35042..0000000 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map +++ /dev/null @@ -1,14370 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../asset_labeling/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CQ;;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AA4PK;;AAAA;AAAA;AAAA;;AAAA;AA5PL;;;AA4PK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAxPL;;;AAAA;AAwPK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAzBR;;;AAyBkC;;AAxBjC;AACA;;AAyBR;;;AAEQ;;;AACA;;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AAnCR;;;AAmC+B;;AAlC9B;AACA;AAkCO;;AAAA;AAAmB;AAAnB;AApCR;;;AAoC8B;;AAnC7B;AACA;AAoCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9CR;;;AA8C2B;AA7C1B;AACA;AA6CO;;AAAA;AAAmB;AAAnB;AA/CR;;;AA+C8B;;AA9C7B;AACA;AA8CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAhDR;;;AAgDyC;;AA/CxC;AACA;AA+CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AArDR;;;AAqD2B;AApD1B;AACA;AAoDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;AADC;AADJ;;;;AAxEL;;;AA2EK;;AA1EJ;AACA;;;;;;AA4ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA1FR;;;AA0F8B;AAzF7B;AACA;AA0FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;AADH;AA/FT;;;AAiGS;;AAhGR;AACA;AAmGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAvHR;;;AAuH8B;AAtH7B;AACA;AAsHO;;AAAA;AAAA;;AAxHR;;;AAwHoC;AAvHnC;AACA;AAyHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA7HL;;;AAgIK;AA/HJ;AACA;AAkImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAtIL;;;AAuIK;;AAtIJ;AACA;AAyII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAxJD;AA0JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA9KR;;;AA8K8B;AA7K7B;AACA;AA8KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;AAA5C;AArLT;;;AAsLS;;AArLR;AACA;AAwLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA1MR;;;AA0M8B;AAzM7B;AACA;AA0MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAlNT;;AAAA;;;AAiOe;AAhOd;AACA;AAkOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAtOD;AAwOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA;AAGR;;;AAI4B;;AAAA;;AAAA;AAvPjB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAwPqB;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAFN;;;;AAAA;AAAA;AAAA;AAAA;AAAP;AAKR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.__algopy_entrypoint_with_init", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 1 0 2 4294967295 4294967296" - }, - "16": { - "op": "bytecblock \"ERR:NOEXIST\" 0x151f7c75 \"\" 0x0000 \"admin\" \"ERR:EXISTS\" 0x0002 \"ERR:UNAUTH\" \"ERR:LENGTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0001" - }, - "105": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "107": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "110": { - "op": "bytec 4 // \"admin\"", - "defined_out": [ - "\"admin\"" - ], - "stack_out": [ - "\"admin\"" - ] - }, - "112": { - "op": "txn Sender", - "defined_out": [ - "\"admin\"", - "new_state_value%0#0" - ], - "stack_out": [ - "\"admin\"", - "new_state_value%0#0" - ] - }, - "114": { - "op": "app_global_put", - "stack_out": [] - }, - "115": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "txn NumAppArgs", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "117": { - "op": "bz main_bare_routing@19", - "stack_out": [] - }, - "120": { - "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\", method \"get_asset_micro(uint64)(string,uint8)\", method \"get_assets_micro(uint64[])void\"", - "defined_out": [ - "Method(add_label(string,string)void)", - "Method(add_label_to_asset(string,asset)void)", - "Method(add_operator_to_label(account,string)void)", - "Method(change_admin(account)void)", - "Method(get_asset_labels(asset)string[])", - "Method(get_asset_micro(uint64)(string,uint8))", - "Method(get_assets_labels(uint64[])string[][])", - "Method(get_assets_micro(uint64[])void)", - "Method(get_label(string)(string,uint64,uint64))", - "Method(get_operator_labels(account)string[])", - "Method(log_labels(string[])void)", - "Method(remove_label(string)void)", - "Method(remove_label_from_asset(string,asset)void)", - "Method(remove_operator_from_label(account,string)void)" - ], - "stack_out": [ - "Method(change_admin(account)void)", - "Method(add_label(string,string)void)", - "Method(remove_label(string)void)", - "Method(get_label(string)(string,uint64,uint64))", - "Method(log_labels(string[])void)", - "Method(add_operator_to_label(account,string)void)", - "Method(remove_operator_from_label(account,string)void)", - "Method(get_operator_labels(account)string[])", - "Method(add_label_to_asset(string,asset)void)", - "Method(remove_label_from_asset(string,asset)void)", - "Method(get_asset_labels(asset)string[])", - "Method(get_assets_labels(uint64[])string[][])", - "Method(get_asset_micro(uint64)(string,uint8))", - "Method(get_assets_micro(uint64[])void)" - ] - }, - "192": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(add_label(string,string)void)", - "Method(add_label_to_asset(string,asset)void)", - "Method(add_operator_to_label(account,string)void)", - "Method(change_admin(account)void)", - "Method(get_asset_labels(asset)string[])", - "Method(get_asset_micro(uint64)(string,uint8))", - "Method(get_assets_labels(uint64[])string[][])", - "Method(get_assets_micro(uint64[])void)", - "Method(get_label(string)(string,uint64,uint64))", - "Method(get_operator_labels(account)string[])", - "Method(log_labels(string[])void)", - "Method(remove_label(string)void)", - "Method(remove_label_from_asset(string,asset)void)", - "Method(remove_operator_from_label(account,string)void)", - "tmp%2#0" - ], - "stack_out": [ - "Method(change_admin(account)void)", - "Method(add_label(string,string)void)", - "Method(remove_label(string)void)", - "Method(get_label(string)(string,uint64,uint64))", - "Method(log_labels(string[])void)", - "Method(add_operator_to_label(account,string)void)", - "Method(remove_operator_from_label(account,string)void)", - "Method(get_operator_labels(account)string[])", - "Method(add_label_to_asset(string,asset)void)", - "Method(remove_label_from_asset(string,asset)void)", - "Method(get_asset_labels(asset)string[])", - "Method(get_assets_labels(uint64[])string[][])", - "Method(get_asset_micro(uint64)(string,uint8))", - "Method(get_assets_micro(uint64[])void)", - "tmp%2#0" - ] - }, - "195": { - "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18", - "stack_out": [] - }, - "225": { - "block": "main_after_if_else@21", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "226": { - "op": "return", - "stack_out": [] - }, - "227": { - "block": "main_get_assets_micro_route@18", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%98#0" - ], - "stack_out": [ - "tmp%98#0" - ] - }, - "229": { - "op": "!", - "defined_out": [ - "tmp%99#0" - ], - "stack_out": [ - "tmp%99#0" - ] - }, - "230": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "231": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%100#0" - ], - "stack_out": [ - "tmp%100#0" - ] - }, - "233": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "234": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%102#0" - ], - "stack_out": [ - "tmp%102#0" - ] - }, - "237": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", - "op": "callsub get_assets_micro", - "stack_out": [] - }, - "240": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "241": { - "op": "return", - "stack_out": [] - }, - "242": { - "block": "main_get_asset_micro_route@17", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%91#0" - ], - "stack_out": [ - "tmp%91#0" - ] - }, - "244": { - "op": "!", - "defined_out": [ - "tmp%92#0" - ], - "stack_out": [ - "tmp%92#0" - ] - }, - "245": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "246": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%93#0" - ], - "stack_out": [ - "tmp%93#0" - ] - }, - "248": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "249": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "reinterpret_bytes[8]%0#0" - ], - "stack_out": [ - "reinterpret_bytes[8]%0#0" - ] - }, - "252": { - "op": "btoi", - "defined_out": [ - "tmp%95#0" - ], - "stack_out": [ - "tmp%95#0" - ] - }, - "253": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", - "op": "callsub get_asset_micro", - "defined_out": [ - "tmp%96#0" - ], - "stack_out": [ - "tmp%96#0" - ] - }, - "256": { - "op": "bytec_1 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%96#0" - ], - "stack_out": [ - "tmp%96#0", - "0x151f7c75" - ] - }, - "257": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%96#0" - ] - }, - "258": { - "op": "concat", - "defined_out": [ - "tmp%97#0" - ], - "stack_out": [ - "tmp%97#0" - ] - }, - "259": { - "op": "log", - "stack_out": [] - }, - "260": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "261": { - "op": "return", - "stack_out": [] - }, - "262": { - "block": "main_get_assets_labels_route@16", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%84#0" - ], - "stack_out": [ - "tmp%84#0" - ] - }, - "264": { - "op": "!", - "defined_out": [ - "tmp%85#0" - ], - "stack_out": [ - "tmp%85#0" - ] - }, - "265": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "266": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%86#0" - ], - "stack_out": [ - "tmp%86#0" - ] - }, - "268": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "269": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%88#0" - ], - "stack_out": [ - "tmp%88#0" - ] - }, - "272": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", - "op": "callsub get_assets_labels", - "defined_out": [ - "tmp%89#0" - ], - "stack_out": [ - "tmp%89#0" - ] - }, - "275": { - "op": "bytec_1 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%89#0" - ], - "stack_out": [ - "tmp%89#0", - "0x151f7c75" - ] - }, - "276": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%89#0" - ] - }, - "277": { - "op": "concat", - "defined_out": [ - "tmp%90#0" - ], - "stack_out": [ - "tmp%90#0" - ] - }, - "278": { - "op": "log", - "stack_out": [] - }, - "279": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "280": { - "op": "return", - "stack_out": [] - }, - "281": { - "block": "main_get_asset_labels_route@15", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%76#0" - ], - "stack_out": [ - "tmp%76#0" - ] - }, - "283": { - "op": "!", - "defined_out": [ - "tmp%77#0" - ], - "stack_out": [ - "tmp%77#0" - ] - }, - "284": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "285": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%78#0" - ], - "stack_out": [ - "tmp%78#0" - ] - }, - "287": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "288": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "reinterpret_bytes[1]%6#0" - ], - "stack_out": [ - "reinterpret_bytes[1]%6#0" - ] - }, - "291": { - "op": "btoi", - "defined_out": [ - "tmp%80#0" - ], - "stack_out": [ - "tmp%80#0" - ] - }, - "292": { - "op": "txnas Assets", - "defined_out": [ - "tmp%81#0" - ], - "stack_out": [ - "tmp%81#0" - ] - }, - "294": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", - "op": "callsub get_asset_labels", - "defined_out": [ - "tmp%82#0" - ], - "stack_out": [ - "tmp%82#0" - ] - }, - "297": { - "op": "bytec_1 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%82#0" - ], - "stack_out": [ - "tmp%82#0", - "0x151f7c75" - ] - }, - "298": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%82#0" - ] - }, - "299": { - "op": "concat", - "defined_out": [ - "tmp%83#0" - ], - "stack_out": [ - "tmp%83#0" - ] - }, - "300": { - "op": "log", - "stack_out": [] - }, - "301": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "302": { - "op": "return", - "stack_out": [] - }, - "303": { - "block": "main_remove_label_from_asset_route@14", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%68#0" - ], - "stack_out": [ - "tmp%68#0" - ] - }, - "305": { - "op": "!", - "defined_out": [ - "tmp%69#0" - ], - "stack_out": [ - "tmp%69#0" - ] - }, - "306": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "307": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%70#0" - ], - "stack_out": [ - "tmp%70#0" - ] - }, - "309": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "310": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%72#0" - ], - "stack_out": [ - "tmp%72#0" - ] - }, - "313": { - "op": "extract 2 0", - "defined_out": [ - "tmp%73#0" - ], - "stack_out": [ - "tmp%73#0" - ] - }, - "316": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "reinterpret_bytes[1]%5#0", - "tmp%73#0" - ], - "stack_out": [ - "tmp%73#0", - "reinterpret_bytes[1]%5#0" - ] - }, - "319": { - "op": "btoi", - "defined_out": [ - "tmp%73#0", - "tmp%74#0" - ], - "stack_out": [ - "tmp%73#0", - "tmp%74#0" - ] - }, - "320": { - "op": "txnas Assets", - "defined_out": [ - "tmp%73#0", - "tmp%75#0" - ], - "stack_out": [ - "tmp%73#0", - "tmp%75#0" - ] - }, - "322": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", - "op": "callsub remove_label_from_asset", - "stack_out": [] - }, - "325": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "326": { - "op": "return", - "stack_out": [] - }, - "327": { - "block": "main_add_label_to_asset_route@13", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%60#0" - ], - "stack_out": [ - "tmp%60#0" - ] - }, - "329": { - "op": "!", - "defined_out": [ - "tmp%61#0" - ], - "stack_out": [ - "tmp%61#0" - ] - }, - "330": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "331": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%62#0" - ], - "stack_out": [ - "tmp%62#0" - ] - }, - "333": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "334": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%64#0" - ], - "stack_out": [ - "tmp%64#0" - ] - }, - "337": { - "op": "extract 2 0", - "defined_out": [ - "tmp%65#0" - ], - "stack_out": [ - "tmp%65#0" - ] - }, - "340": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "reinterpret_bytes[1]%4#0", - "tmp%65#0" - ], - "stack_out": [ - "tmp%65#0", - "reinterpret_bytes[1]%4#0" - ] - }, - "343": { - "op": "btoi", - "defined_out": [ - "tmp%65#0", - "tmp%66#0" - ], - "stack_out": [ - "tmp%65#0", - "tmp%66#0" - ] - }, - "344": { - "op": "txnas Assets", - "defined_out": [ - "tmp%65#0", - "tmp%67#0" - ], - "stack_out": [ - "tmp%65#0", - "tmp%67#0" - ] - }, - "346": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", - "op": "callsub add_label_to_asset", - "stack_out": [] - }, - "349": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "350": { - "op": "return", - "stack_out": [] - }, - "351": { - "block": "main_get_operator_labels_route@12", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%52#0" - ], - "stack_out": [ - "tmp%52#0" - ] - }, - "353": { - "op": "!", - "defined_out": [ - "tmp%53#0" - ], - "stack_out": [ - "tmp%53#0" - ] - }, - "354": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "355": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%54#0" - ], - "stack_out": [ - "tmp%54#0" - ] - }, - "357": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "358": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "reinterpret_bytes[1]%3#0" - ], - "stack_out": [ - "reinterpret_bytes[1]%3#0" - ] - }, - "361": { - "op": "btoi", - "defined_out": [ - "tmp%56#0" - ], - "stack_out": [ - "tmp%56#0" - ] - }, - "362": { - "op": "txnas Accounts", - "defined_out": [ - "tmp%57#0" - ], - "stack_out": [ - "tmp%57#0" - ] - }, - "364": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", - "op": "callsub get_operator_labels", - "defined_out": [ - "tmp%58#0" - ], - "stack_out": [ - "tmp%58#0" - ] - }, - "367": { - "op": "bytec_1 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%58#0" - ], - "stack_out": [ - "tmp%58#0", - "0x151f7c75" - ] - }, - "368": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%58#0" - ] - }, - "369": { - "op": "concat", - "defined_out": [ - "tmp%59#0" - ], - "stack_out": [ - "tmp%59#0" - ] - }, - "370": { - "op": "log", - "stack_out": [] - }, - "371": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "372": { - "op": "return", - "stack_out": [] - }, - "373": { - "block": "main_remove_operator_from_label_route@11", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%44#0" - ], - "stack_out": [ - "tmp%44#0" - ] - }, - "375": { - "op": "!", - "defined_out": [ - "tmp%45#0" - ], - "stack_out": [ - "tmp%45#0" - ] - }, - "376": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "377": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%46#0" - ], - "stack_out": [ - "tmp%46#0" - ] - }, - "379": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "380": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "reinterpret_bytes[1]%2#0" - ], - "stack_out": [ - "reinterpret_bytes[1]%2#0" - ] - }, - "383": { - "op": "btoi", - "defined_out": [ - "tmp%48#0" - ], - "stack_out": [ - "tmp%48#0" - ] - }, - "384": { - "op": "txnas Accounts", - "defined_out": [ - "tmp%49#0" - ], - "stack_out": [ - "tmp%49#0" - ] - }, - "386": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%49#0", - "tmp%50#0" - ], - "stack_out": [ - "tmp%49#0", - "tmp%50#0" - ] - }, - "389": { - "op": "extract 2 0", - "defined_out": [ - "tmp%49#0", - "tmp%51#0" - ], - "stack_out": [ - "tmp%49#0", - "tmp%51#0" - ] - }, - "392": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", - "op": "callsub remove_operator_from_label", - "stack_out": [] - }, - "395": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "396": { - "op": "return", - "stack_out": [] - }, - "397": { - "block": "main_add_operator_to_label_route@10", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%36#0" - ], - "stack_out": [ - "tmp%36#0" - ] - }, - "399": { - "op": "!", - "defined_out": [ - "tmp%37#0" - ], - "stack_out": [ - "tmp%37#0" - ] - }, - "400": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "401": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%38#0" - ], - "stack_out": [ - "tmp%38#0" - ] - }, - "403": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "404": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "reinterpret_bytes[1]%1#0" - ], - "stack_out": [ - "reinterpret_bytes[1]%1#0" - ] - }, - "407": { - "op": "btoi", - "defined_out": [ - "tmp%40#0" - ], - "stack_out": [ - "tmp%40#0" - ] - }, - "408": { - "op": "txnas Accounts", - "defined_out": [ - "tmp%41#0" - ], - "stack_out": [ - "tmp%41#0" - ] - }, - "410": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%41#0", - "tmp%42#0" - ], - "stack_out": [ - "tmp%41#0", - "tmp%42#0" - ] - }, - "413": { - "op": "extract 2 0", - "defined_out": [ - "tmp%41#0", - "tmp%43#0" - ], - "stack_out": [ - "tmp%41#0", - "tmp%43#0" - ] - }, - "416": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", - "op": "callsub add_operator_to_label", - "stack_out": [] - }, - "419": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "420": { - "op": "return", - "stack_out": [] - }, - "421": { - "block": "main_log_labels_route@9", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%31#0" - ], - "stack_out": [ - "tmp%31#0" - ] - }, - "423": { - "op": "!", - "defined_out": [ - "tmp%32#0" - ], - "stack_out": [ - "tmp%32#0" - ] - }, - "424": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "425": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%33#0" - ], - "stack_out": [ - "tmp%33#0" - ] - }, - "427": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "428": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%35#0" - ], - "stack_out": [ - "tmp%35#0" - ] - }, - "431": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", - "op": "callsub log_labels", - "stack_out": [] - }, - "434": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "435": { - "op": "return", - "stack_out": [] - }, - "436": { - "block": "main_get_label_route@8", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%23#0" - ], - "stack_out": [ - "tmp%23#0" - ] - }, - "438": { - "op": "!", - "defined_out": [ - "tmp%24#0" - ], - "stack_out": [ - "tmp%24#0" - ] - }, - "439": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "440": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%25#0" - ], - "stack_out": [ - "tmp%25#0" - ] - }, - "442": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "443": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%27#0" - ], - "stack_out": [ - "tmp%27#0" - ] - }, - "446": { - "op": "extract 2 0", - "defined_out": [ - "tmp%28#0" - ], - "stack_out": [ - "tmp%28#0" - ] - }, - "449": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", - "op": "callsub get_label", - "defined_out": [ - "tmp%29#0" - ], - "stack_out": [ - "tmp%29#0" - ] - }, - "452": { - "op": "bytec_1 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%29#0" - ], - "stack_out": [ - "tmp%29#0", - "0x151f7c75" - ] - }, - "453": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%29#0" - ] - }, - "454": { - "op": "concat", - "defined_out": [ - "tmp%30#0" - ], - "stack_out": [ - "tmp%30#0" - ] - }, - "455": { - "op": "log", - "stack_out": [] - }, - "456": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "457": { - "op": "return", - "stack_out": [] - }, - "458": { - "block": "main_remove_label_route@7", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%17#0" - ], - "stack_out": [ - "tmp%17#0" - ] - }, - "460": { - "op": "!", - "defined_out": [ - "tmp%18#0" - ], - "stack_out": [ - "tmp%18#0" - ] - }, - "461": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "462": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%19#0" - ], - "stack_out": [ - "tmp%19#0" - ] - }, - "464": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "465": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%21#0" - ], - "stack_out": [ - "tmp%21#0" - ] - }, - "468": { - "op": "extract 2 0", - "defined_out": [ - "tmp%22#0" - ], - "stack_out": [ - "tmp%22#0" - ] - }, - "471": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", - "op": "callsub remove_label", - "stack_out": [] - }, - "474": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "475": { - "op": "return", - "stack_out": [] - }, - "476": { - "block": "main_add_label_route@6", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%9#0" - ], - "stack_out": [ - "tmp%9#0" - ] - }, - "478": { - "op": "!", - "defined_out": [ - "tmp%10#0" - ], - "stack_out": [ - "tmp%10#0" - ] - }, - "479": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "480": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%11#0" - ], - "stack_out": [ - "tmp%11#0" - ] - }, - "482": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "483": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%13#0" - ], - "stack_out": [ - "tmp%13#0" - ] - }, - "486": { - "op": "extract 2 0", - "defined_out": [ - "tmp%14#0" - ], - "stack_out": [ - "tmp%14#0" - ] - }, - "489": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%14#0", - "tmp%15#0" - ], - "stack_out": [ - "tmp%14#0", - "tmp%15#0" - ] - }, - "492": { - "op": "extract 2 0", - "defined_out": [ - "tmp%14#0", - "tmp%16#0" - ], - "stack_out": [ - "tmp%14#0", - "tmp%16#0" - ] - }, - "495": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", - "op": "callsub add_label", - "stack_out": [] - }, - "498": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "499": { - "op": "return", - "stack_out": [] - }, - "500": { - "block": "main_change_admin_route@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "502": { - "op": "!", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "503": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "504": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "506": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "507": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "reinterpret_bytes[1]%0#0" - ], - "stack_out": [ - "reinterpret_bytes[1]%0#0" - ] - }, - "510": { - "op": "btoi", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "511": { - "op": "txnas Accounts", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "513": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", - "op": "callsub change_admin", - "stack_out": [] - }, - "516": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "517": { - "op": "return", - "stack_out": [] - }, - "518": { - "block": "main_bare_routing@19", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%103#0" - ], - "stack_out": [ - "tmp%103#0" - ] - }, - "520": { - "op": "bnz main_after_if_else@21", - "stack_out": [] - }, - "523": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%104#0" - ], - "stack_out": [ - "tmp%104#0" - ] - }, - "525": { - "op": "!", - "defined_out": [ - "tmp%105#0" - ], - "stack_out": [ - "tmp%105#0" - ] - }, - "526": { - "error": "can only call when creating", - "op": "assert // can only call when creating", - "stack_out": [] - }, - "527": { - "op": "intc_0 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "528": { - "op": "return", - "stack_out": [] - }, - "529": { - "subroutine": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "params": { - "array#0": "bytes", - "new_items_bytes#0": "bytes", - "new_items_count#0": "uint64" - }, - "block": "dynamic_array_concat_byte_length_head", - "stack_in": [], - "op": "proto 3 1" - }, - "532": { - "op": "frame_dig -3", - "defined_out": [ - "array#0 (copy)" - ], - "stack_out": [ - "array#0 (copy)" - ] - }, - "534": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "array#0 (copy)" - ], - "stack_out": [ - "array#0 (copy)", - "0" - ] - }, - "535": { - "op": "extract_uint16", - "defined_out": [ - "array_length#0" - ], - "stack_out": [ - "array_length#0" - ] - }, - "536": { - "op": "dup", - "defined_out": [ - "array_length#0", - "array_length#0 (copy)" - ], - "stack_out": [ - "array_length#0", - "array_length#0 (copy)" - ] - }, - "537": { - "op": "frame_dig -1", - "defined_out": [ - "array_length#0", - "array_length#0 (copy)", - "new_items_count#0 (copy)" - ], - "stack_out": [ - "array_length#0", - "array_length#0 (copy)", - "new_items_count#0 (copy)" - ] - }, - "539": { - "op": "+", - "defined_out": [ - "array_length#0", - "new_length#0" - ], - "stack_out": [ - "array_length#0", - "new_length#0" - ] - }, - "540": { - "op": "swap", - "stack_out": [ - "new_length#0", - "array_length#0" - ] - }, - "541": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_length#0", - "new_length#0" - ], - "stack_out": [ - "new_length#0", - "array_length#0", - "2" - ] - }, - "542": { - "op": "*", - "defined_out": [ - "new_length#0", - "tmp%0#0" - ], - "stack_out": [ - "new_length#0", - "tmp%0#0" - ] - }, - "543": { - "op": "intc_2 // 2", - "stack_out": [ - "new_length#0", - "tmp%0#0", - "2" - ] - }, - "544": { - "op": "+", - "defined_out": [ - "header_end#0", - "new_length#0" - ], - "stack_out": [ - "new_length#0", - "header_end#0" - ] - }, - "545": { - "op": "dig 1", - "defined_out": [ - "header_end#0", - "new_length#0", - "new_length#0 (copy)" - ], - "stack_out": [ - "new_length#0", - "header_end#0", - "new_length#0 (copy)" - ] - }, - "547": { - "op": "itob", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%1#0" - ], - "stack_out": [ - "new_length#0", - "header_end#0", - "tmp%1#0" - ] - }, - "548": { - "op": "extract 6 2", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%2#0" - ], - "stack_out": [ - "new_length#0", - "header_end#0", - "tmp%2#0" - ] - }, - "551": { - "op": "cover 2", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0" - ] - }, - "553": { - "op": "frame_dig -3", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "array#0 (copy)" - ] - }, - "555": { - "op": "intc_2 // 2", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "array#0 (copy)", - "2" - ] - }, - "556": { - "op": "dig 2", - "defined_out": [ - "2", - "array#0 (copy)", - "header_end#0", - "header_end#0 (copy)", - "new_length#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "array#0 (copy)", - "2", - "header_end#0 (copy)" - ] - }, - "558": { - "op": "substring3", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%3#0" - ] - }, - "559": { - "op": "frame_dig -1", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%3#0", - "new_items_count#0 (copy)" - ] - }, - "561": { - "op": "intc_2 // 2", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%3#0", - "new_items_count#0 (copy)", - "2" - ] - }, - "562": { - "op": "*", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%2#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%3#0", - "tmp%4#0" - ] - }, - "563": { - "op": "bzero", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%2#0", - "tmp%3#0", - "tmp%5#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%3#0", - "tmp%5#0" - ] - }, - "564": { - "op": "concat", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%2#0", - "tmp%6#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%6#0" - ] - }, - "565": { - "op": "frame_dig -3", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%6#0", - "array#0 (copy)" - ] - }, - "567": { - "op": "len", - "defined_out": [ - "header_end#0", - "new_length#0", - "tmp%2#0", - "tmp%6#0", - "tmp%7#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%6#0", - "tmp%7#0" - ] - }, - "568": { - "op": "frame_dig -3", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "header_end#0", - "tmp%6#0", - "tmp%7#0", - "array#0 (copy)" - ] - }, - "570": { - "op": "uncover 3", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "tmp%6#0", - "tmp%7#0", - "array#0 (copy)", - "header_end#0" - ] - }, - "572": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "new_length#0", - "tmp%6#0", - "array#0 (copy)", - "header_end#0", - "tmp%7#0" - ] - }, - "574": { - "op": "substring3", - "defined_out": [ - "new_length#0", - "tmp%2#0", - "tmp%6#0", - "tmp%8#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "tmp%6#0", - "tmp%8#0" - ] - }, - "575": { - "op": "concat", - "defined_out": [ - "new_length#0", - "tmp%2#0", - "tmp%9#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "tmp%9#0" - ] - }, - "576": { - "op": "frame_dig -2", - "defined_out": [ - "new_items_bytes#0 (copy)", - "new_length#0", - "tmp%2#0", - "tmp%9#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "tmp%9#0", - "new_items_bytes#0 (copy)" - ] - }, - "578": { - "op": "concat", - "defined_out": [ - "array_head_and_tail#0", - "new_length#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "new_length#0", - "array_head_and_tail#0" - ] - }, - "579": { - "op": "swap", - "defined_out": [ - "array_head_and_tail#0", - "new_length#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "new_length#0" - ] - }, - "580": { - "op": "intc_2 // 2", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "new_length#0", - "2" - ] - }, - "581": { - "op": "*", - "defined_out": [ - "array_head_and_tail#0", - "tail_offset#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0" - ] - }, - "582": { - "op": "dup", - "defined_out": [ - "array_head_and_tail#0", - "tail_offset#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "tail_offset#0" - ] - }, - "583": { - "op": "intc_1 // 0", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "tail_offset#0", - "head_offset#0" - ] - }, - "584": { - "op": "swap", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1" - ] - }, - "585": { - "block": "dynamic_array_concat_byte_length_head_for_header@2", - "stack_in": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1" - ], - "op": "frame_dig 3", - "defined_out": [ - "head_offset#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0" - ] - }, - "587": { - "op": "frame_dig 2", - "defined_out": [ - "head_offset#0", - "tail_offset#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#0" - ] - }, - "589": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "head_offset#0", - "tail_offset#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "continue_looping%0#0" - ] - }, - "590": { - "op": "bz dynamic_array_concat_byte_length_head_after_for@5", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1" - ] - }, - "593": { - "op": "frame_dig 4", - "defined_out": [ - "head_offset#0", - "tail_offset#0", - "tail_offset#1" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tail_offset#1" - ] - }, - "595": { - "op": "dup", - "defined_out": [ - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tail_offset#1 (copy)" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tail_offset#1", - "tail_offset#1 (copy)" - ] - }, - "596": { - "op": "itob", - "defined_out": [ - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tmp%5#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tail_offset#1", - "tmp%5#0" - ] - }, - "597": { - "op": "extract 6 2", - "defined_out": [ - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tail_offset_bytes#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tail_offset#1", - "tail_offset_bytes#0" - ] - }, - "600": { - "op": "frame_dig 1", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tail_offset_bytes#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tail_offset#1", - "tail_offset_bytes#0", - "array_head_and_tail#0" - ] - }, - "602": { - "op": "frame_dig 3", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tail_offset#1", - "tail_offset_bytes#0", - "array_head_and_tail#0", - "head_offset#0" - ] - }, - "604": { - "op": "dup", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "head_offset#0 (copy)", - "tail_offset#0", - "tail_offset#1", - "tail_offset_bytes#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tail_offset#1", - "tail_offset_bytes#0", - "array_head_and_tail#0", - "head_offset#0 (copy)", - "head_offset#0 (copy)" - ] - }, - "605": { - "op": "cover 4", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "tail_offset_bytes#0", - "array_head_and_tail#0", - "head_offset#0 (copy)" - ] - }, - "607": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "array_head_and_tail#0", - "head_offset#0 (copy)", - "tail_offset_bytes#0" - ] - }, - "609": { - "op": "replace3", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "array_head_and_tail#0" - ] - }, - "610": { - "op": "dup", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "array_head_and_tail#0", - "array_head_and_tail#0" - ] - }, - "611": { - "op": "frame_bury 1", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tail_offset#1" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "array_head_and_tail#0" - ] - }, - "613": { - "op": "dig 1", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "array_head_and_tail#0", - "tail_offset#1 (copy)" - ] - }, - "615": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tmp%6#1" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "tmp%6#1" - ] - }, - "616": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tmp%6#1" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "tmp%6#1", - "2" - ] - }, - "617": { - "op": "+", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tail_offset#1", - "tmp%7#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1", - "tmp%7#0" - ] - }, - "618": { - "op": "+", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "tail_offset#1" - ] - }, - "619": { - "op": "frame_bury 4", - "defined_out": [ - "array_head_and_tail#0", - "head_offset#0", - "tail_offset#0", - "tail_offset#1" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0" - ] - }, - "621": { - "op": "intc_2 // 2", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0", - "2" - ] - }, - "622": { - "op": "+", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "head_offset#0" - ] - }, - "623": { - "op": "frame_bury 3", - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1" - ] - }, - "625": { - "op": "b dynamic_array_concat_byte_length_head_for_header@2" - }, - "628": { - "block": "dynamic_array_concat_byte_length_head_after_for@5", - "stack_in": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1" - ], - "op": "frame_dig 0", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tmp%2#0" - ] - }, - "630": { - "op": "frame_dig 1", - "defined_out": [ - "array_head_and_tail#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tmp%2#0", - "array_head_and_tail#0" - ] - }, - "632": { - "op": "concat", - "defined_out": [ - "array_head_and_tail#0", - "tmp%12#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "array_head_and_tail#0", - "tail_offset#0", - "head_offset#0", - "tail_offset#1", - "tmp%12#0" - ] - }, - "633": { - "op": "frame_bury 0" - }, - "635": { - "retsub": true, - "op": "retsub" - }, - "636": { - "subroutine": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", - "params": { - "array_items_count#0": "uint64", - "array_head_and_tail#0": "bytes", - "new_items_count#0": "uint64", - "new_head_and_tail#0": "bytes" - }, - "block": "dynamic_array_concat_dynamic_element", - "stack_in": [], - "op": "proto 4 1" - }, - "639": { - "op": "bytec_2 // \"\"", - "stack_out": [ - "item_offset_adjustment#2" - ] - }, - "640": { - "op": "dup" - }, - "641": { - "op": "frame_dig -2" - }, - "643": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "new_head#0", - "new_items_count#0 (copy)" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "new_items_count#0 (copy)", - "2" - ] - }, - "644": { - "op": "*", - "defined_out": [ - "item_offset_adjustment#0", - "new_head#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0" - ] - }, - "645": { - "op": "frame_dig -4", - "defined_out": [ - "array_items_count#0 (copy)", - "item_offset_adjustment#0", - "new_head#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "array_items_count#0 (copy)" - ] - }, - "647": { - "op": "intc_2 // 2", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "array_items_count#0 (copy)", - "2" - ] - }, - "648": { - "op": "*", - "defined_out": [ - "item_offset_adjustment#0", - "new_head#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0" - ] - }, - "649": { - "op": "intc_1 // 0", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "new_head#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ] - }, - "650": { - "block": "dynamic_array_concat_dynamic_element_for_header@1", - "stack_in": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ], - "op": "frame_dig 4", - "defined_out": [ - "head_offset#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0" - ] - }, - "652": { - "op": "frame_dig 3", - "defined_out": [ - "head_offset#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%0#0" - ] - }, - "654": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "head_offset#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "continue_looping%0#0" - ] - }, - "655": { - "op": "bz dynamic_array_concat_dynamic_element_after_for@4", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ] - }, - "658": { - "op": "frame_dig -3", - "defined_out": [ - "array_head_and_tail#0 (copy)", - "head_offset#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "array_head_and_tail#0 (copy)" - ] - }, - "660": { - "op": "frame_dig 4", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "array_head_and_tail#0 (copy)", - "head_offset#0" - ] - }, - "662": { - "op": "dup", - "defined_out": [ - "array_head_and_tail#0 (copy)", - "head_offset#0", - "head_offset#0 (copy)", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "array_head_and_tail#0 (copy)", - "head_offset#0 (copy)", - "head_offset#0 (copy)" - ] - }, - "663": { - "op": "cover 2", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "array_head_and_tail#0 (copy)", - "head_offset#0 (copy)" - ] - }, - "665": { - "op": "extract_uint16", - "defined_out": [ - "head_offset#0", - "item_offset#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "item_offset#0" - ] - }, - "666": { - "op": "frame_dig 2", - "defined_out": [ - "head_offset#0", - "item_offset#0", - "item_offset_adjustment#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "item_offset#0", - "item_offset_adjustment#0" - ] - }, - "668": { - "op": "+", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "tmp%0#0", - "tmp%1#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%1#0" - ] - }, - "669": { - "op": "itob", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "tmp%0#0", - "tmp%2#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%2#0" - ] - }, - "670": { - "op": "extract 6 2", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "tmp%0#0", - "tmp%3#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%3#0" - ] - }, - "673": { - "op": "frame_dig 1", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "new_head#0", - "tmp%0#0", - "tmp%3#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%3#0", - "new_head#0" - ] - }, - "675": { - "op": "swap", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "new_head#0", - "tmp%3#0" - ] - }, - "676": { - "op": "concat", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "new_head#0" - ] - }, - "677": { - "op": "frame_bury 1", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "new_head#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0" - ] - }, - "679": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "head_offset#0", - "item_offset_adjustment#0", - "new_head#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "2" - ] - }, - "680": { - "op": "+", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0" - ] - }, - "681": { - "op": "frame_bury 4", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "new_head#0", - "tmp%0#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ] - }, - "683": { - "op": "b dynamic_array_concat_dynamic_element_for_header@1" - }, - "686": { - "block": "dynamic_array_concat_dynamic_element_after_for@4", - "stack_in": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ], - "op": "frame_dig -3", - "defined_out": [ - "array_head_and_tail#0 (copy)" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "array_head_and_tail#0 (copy)" - ] - }, - "688": { - "op": "len", - "defined_out": [ - "item_offset_adjustment#2" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "item_offset_adjustment#2" - ] - }, - "689": { - "op": "frame_bury 0", - "defined_out": [ - "item_offset_adjustment#2" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ] - }, - "691": { - "op": "intc_1 // 0", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#2" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0" - ] - }, - "692": { - "op": "frame_bury 4", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#2" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ] - }, - "694": { - "block": "dynamic_array_concat_dynamic_element_for_header@5", - "stack_in": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ], - "op": "frame_dig 4", - "defined_out": [ - "head_offset#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0" - ] - }, - "696": { - "op": "frame_dig 2", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "item_offset_adjustment#0" - ] - }, - "698": { - "op": "<", - "defined_out": [ - "continue_looping%1#0", - "head_offset#0", - "item_offset_adjustment#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "continue_looping%1#0" - ] - }, - "699": { - "op": "bz dynamic_array_concat_dynamic_element_after_for@8", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ] - }, - "702": { - "op": "frame_dig -1", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "new_head_and_tail#0 (copy)" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "new_head_and_tail#0 (copy)" - ] - }, - "704": { - "op": "frame_dig 4", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "new_head_and_tail#0 (copy)", - "head_offset#0" - ] - }, - "706": { - "op": "dup", - "defined_out": [ - "head_offset#0", - "head_offset#0 (copy)", - "item_offset_adjustment#0", - "new_head_and_tail#0 (copy)" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "new_head_and_tail#0 (copy)", - "head_offset#0 (copy)", - "head_offset#0 (copy)" - ] - }, - "707": { - "op": "cover 2", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "new_head_and_tail#0 (copy)", - "head_offset#0 (copy)" - ] - }, - "709": { - "op": "extract_uint16", - "defined_out": [ - "head_offset#0", - "item_offset#0", - "item_offset_adjustment#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "item_offset#0" - ] - }, - "710": { - "op": "frame_dig 0", - "defined_out": [ - "head_offset#0", - "item_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "item_offset#0", - "item_offset_adjustment#2" - ] - }, - "712": { - "op": "+", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "tmp%5#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%5#0" - ] - }, - "713": { - "op": "itob", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "tmp%6#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%6#0" - ] - }, - "714": { - "op": "extract 6 2", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "tmp%7#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%7#0" - ] - }, - "717": { - "op": "frame_dig 1", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "new_head#0", - "tmp%7#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "tmp%7#0", - "new_head#0" - ] - }, - "719": { - "op": "swap", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "new_head#0", - "tmp%7#0" - ] - }, - "720": { - "op": "concat", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "new_head#0" - ] - }, - "721": { - "op": "frame_bury 1", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "new_head#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0" - ] - }, - "723": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "head_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "new_head#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0", - "2" - ] - }, - "724": { - "op": "+", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "head_offset#0" - ] - }, - "725": { - "op": "frame_bury 4", - "defined_out": [ - "head_offset#0", - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "new_head#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ] - }, - "727": { - "op": "b dynamic_array_concat_dynamic_element_for_header@5" - }, - "730": { - "block": "dynamic_array_concat_dynamic_element_after_for@8", - "stack_in": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0" - ], - "op": "frame_dig -4", - "defined_out": [ - "array_items_count#0 (copy)" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "array_items_count#0 (copy)" - ] - }, - "732": { - "op": "frame_dig -2", - "defined_out": [ - "array_items_count#0 (copy)", - "new_items_count#0 (copy)" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "array_items_count#0 (copy)", - "new_items_count#0 (copy)" - ] - }, - "734": { - "op": "+", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%8#0" - ] - }, - "735": { - "op": "itob", - "defined_out": [ - "tmp%9#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%9#0" - ] - }, - "736": { - "op": "extract 6 2", - "defined_out": [ - "tmp%10#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%10#0" - ] - }, - "739": { - "op": "frame_dig 1", - "defined_out": [ - "new_head#0", - "tmp%10#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%10#0", - "new_head#0" - ] - }, - "741": { - "op": "concat", - "defined_out": [ - "new_head#0", - "tmp%11#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%11#0" - ] - }, - "742": { - "op": "frame_dig -3", - "defined_out": [ - "array_head_and_tail#0 (copy)", - "new_head#0", - "tmp%11#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%11#0", - "array_head_and_tail#0 (copy)" - ] - }, - "744": { - "op": "frame_dig 3", - "defined_out": [ - "array_head_and_tail#0 (copy)", - "new_head#0", - "tmp%0#0", - "tmp%11#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%11#0", - "array_head_and_tail#0 (copy)", - "tmp%0#0" - ] - }, - "746": { - "op": "frame_dig 0", - "defined_out": [ - "array_head_and_tail#0 (copy)", - "item_offset_adjustment#2", - "new_head#0", - "tmp%0#0", - "tmp%11#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%11#0", - "array_head_and_tail#0 (copy)", - "tmp%0#0", - "item_offset_adjustment#2" - ] - }, - "748": { - "op": "substring3", - "defined_out": [ - "item_offset_adjustment#2", - "new_head#0", - "tmp%0#0", - "tmp%11#0", - "tmp%14#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%11#0", - "tmp%14#0" - ] - }, - "749": { - "op": "concat", - "defined_out": [ - "item_offset_adjustment#2", - "new_head#0", - "tmp%0#0", - "tmp%15#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%15#0" - ] - }, - "750": { - "op": "frame_dig -1", - "defined_out": [ - "item_offset_adjustment#2", - "new_head#0", - "new_head_and_tail#0 (copy)", - "tmp%0#0", - "tmp%15#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%15#0", - "new_head_and_tail#0 (copy)" - ] - }, - "752": { - "op": "len", - "defined_out": [ - "item_offset_adjustment#2", - "new_head#0", - "tmp%0#0", - "tmp%15#0", - "tmp%17#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%15#0", - "tmp%17#0" - ] - }, - "753": { - "op": "frame_dig -1", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%15#0", - "tmp%17#0", - "new_head_and_tail#0 (copy)" - ] - }, - "755": { - "op": "frame_dig 2", - "defined_out": [ - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "new_head#0", - "new_head_and_tail#0 (copy)", - "tmp%0#0", - "tmp%15#0", - "tmp%17#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%15#0", - "tmp%17#0", - "new_head_and_tail#0 (copy)", - "item_offset_adjustment#0" - ] - }, - "757": { - "op": "uncover 2", - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%15#0", - "new_head_and_tail#0 (copy)", - "item_offset_adjustment#0", - "tmp%17#0" - ] - }, - "759": { - "op": "substring3", - "defined_out": [ - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "new_head#0", - "tmp%0#0", - "tmp%15#0", - "tmp%18#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%15#0", - "tmp%18#0" - ] - }, - "760": { - "op": "concat", - "defined_out": [ - "item_offset_adjustment#0", - "item_offset_adjustment#2", - "new_head#0", - "tmp%0#0", - "tmp%19#0" - ], - "stack_out": [ - "item_offset_adjustment#2", - "new_head#0", - "item_offset_adjustment#0", - "tmp%0#0", - "head_offset#0", - "tmp%19#0" - ] - }, - "761": { - "op": "frame_bury 0" - }, - "763": { - "retsub": true, - "op": "retsub" - }, - "764": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "params": {}, - "block": "admin_only", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "766": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "767": { - "op": "bytec 4 // \"admin\"", - "defined_out": [ - "\"admin\"", - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0", - "\"admin\"" - ] - }, - "769": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "770": { - "error": "check self.admin exists", - "op": "assert // check self.admin exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "771": { - "op": "==", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "cond#0" - ] - }, - "772": { - "op": "bnz admin_only_after_if_else@3", - "stack_out": [] - }, - "775": { - "op": "bytec 7 // \"ERR:UNAUTH\"", - "defined_out": [ - "\"ERR:UNAUTH\"" - ], - "stack_out": [ - "\"ERR:UNAUTH\"" - ] - }, - "777": { - "op": "log", - "stack_out": [] - }, - "778": { - "op": "err" - }, - "779": { - "block": "admin_only_after_if_else@3", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "780": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", - "params": { - "new_admin#0": "bytes" - }, - "block": "change_admin", - "stack_in": [], - "op": "proto 1 0" - }, - "783": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "op": "callsub admin_only" - }, - "786": { - "op": "bytec 4 // \"admin\"", - "defined_out": [ - "\"admin\"" - ], - "stack_out": [ - "\"admin\"" - ] - }, - "788": { - "op": "frame_dig -1", - "defined_out": [ - "\"admin\"", - "new_admin#0 (copy)" - ], - "stack_out": [ - "\"admin\"", - "new_admin#0 (copy)" - ] - }, - "790": { - "op": "app_global_put", - "stack_out": [] - }, - "791": { - "retsub": true, - "op": "retsub" - }, - "792": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", - "params": { - "id#0": "bytes", - "name#0": "bytes" - }, - "block": "add_label", - "stack_in": [], - "op": "proto 2 0" - }, - "795": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "op": "callsub admin_only" - }, - "798": { - "op": "frame_dig -2", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "800": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "801": { - "op": "bury 1", - "stack_out": [ - "maybe_exists%0#0" - ] - }, - "803": { - "op": "bz add_label_after_if_else@3", - "stack_out": [] - }, - "806": { - "op": "bytec 5 // \"ERR:EXISTS\"", - "defined_out": [ - "\"ERR:EXISTS\"" - ], - "stack_out": [ - "\"ERR:EXISTS\"" - ] - }, - "808": { - "op": "log", - "stack_out": [] - }, - "809": { - "op": "err" - }, - "810": { - "block": "add_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -2", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "812": { - "op": "len", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "813": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "2" - ] - }, - "814": { - "op": "==", - "defined_out": [ - "cond#1" - ], - "stack_out": [ - "cond#1" - ] - }, - "815": { - "op": "bnz add_label_after_if_else@7", - "stack_out": [] - }, - "818": { - "op": "bytec 8 // \"ERR:LENGTH\"", - "defined_out": [ - "\"ERR:LENGTH\"" - ], - "stack_out": [ - "\"ERR:LENGTH\"" - ] - }, - "820": { - "op": "log", - "stack_out": [] - }, - "821": { - "op": "err" - }, - "822": { - "block": "add_label_after_if_else@7", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "name#0 (copy)" - ], - "stack_out": [ - "name#0 (copy)" - ] - }, - "824": { - "op": "len", - "defined_out": [ - "length%0#0" - ], - "stack_out": [ - "length%0#0" - ] - }, - "825": { - "op": "itob", - "defined_out": [ - "as_bytes%0#0" - ], - "stack_out": [ - "as_bytes%0#0" - ] - }, - "826": { - "op": "extract 6 2", - "defined_out": [ - "length_uint16%0#0" - ], - "stack_out": [ - "length_uint16%0#0" - ] - }, - "829": { - "op": "frame_dig -1", - "stack_out": [ - "length_uint16%0#0", - "name#0 (copy)" - ] - }, - "831": { - "op": "concat", - "defined_out": [ - "encoded_value%0#0" - ], - "stack_out": [ - "encoded_value%0#0" - ] - }, - "832": { - "op": "pushbytes 0x001200000000000000000000000000000000", - "defined_out": [ - "0x001200000000000000000000000000000000", - "encoded_value%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "0x001200000000000000000000000000000000" - ] - }, - "852": { - "op": "swap", - "stack_out": [ - "0x001200000000000000000000000000000000", - "encoded_value%0#0" - ] - }, - "853": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%4#0" - ], - "stack_out": [ - "encoded_tuple_buffer%4#0" - ] - }, - "854": { - "op": "frame_dig -2", - "defined_out": [ - "encoded_tuple_buffer%4#0", - "id#0 (copy)" - ], - "stack_out": [ - "encoded_tuple_buffer%4#0", - "id#0 (copy)" - ] - }, - "856": { - "op": "box_del", - "defined_out": [ - "encoded_tuple_buffer%4#0", - "{box_del}" - ], - "stack_out": [ - "encoded_tuple_buffer%4#0", - "{box_del}" - ] - }, - "857": { - "op": "pop", - "stack_out": [ - "encoded_tuple_buffer%4#0" - ] - }, - "858": { - "op": "frame_dig -2", - "stack_out": [ - "encoded_tuple_buffer%4#0", - "id#0 (copy)" - ] - }, - "860": { - "op": "swap", - "stack_out": [ - "id#0 (copy)", - "encoded_tuple_buffer%4#0" - ] - }, - "861": { - "op": "box_put", - "stack_out": [] - }, - "862": { - "retsub": true, - "op": "retsub" - }, - "863": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", - "params": { - "id#0": "bytes" - }, - "block": "remove_label", - "stack_in": [], - "op": "proto 1 0" - }, - "866": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", - "op": "callsub admin_only" - }, - "869": { - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "871": { - "op": "box_len", - "defined_out": [ - "cond#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "cond#0" - ] - }, - "872": { - "op": "bury 1", - "stack_out": [ - "cond#0" - ] - }, - "874": { - "op": "bnz remove_label_after_if_else@3", - "stack_out": [] - }, - "877": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "\"ERR:NOEXIST\"" - ] - }, - "878": { - "op": "log", - "stack_out": [] - }, - "879": { - "op": "err" - }, - "880": { - "block": "remove_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "882": { - "op": "len", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "883": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "2" - ] - }, - "884": { - "op": "==", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "cond#0" - ] - }, - "885": { - "op": "bnz remove_label_after_if_else@7", - "stack_out": [] - }, - "888": { - "op": "bytec 8 // \"ERR:LENGTH\"", - "defined_out": [ - "\"ERR:LENGTH\"" - ], - "stack_out": [ - "\"ERR:LENGTH\"" - ] - }, - "890": { - "op": "log", - "stack_out": [] - }, - "891": { - "op": "err" - }, - "892": { - "block": "remove_label_after_if_else@7", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "894": { - "op": "box_get", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "895": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "maybe_value%1#0" - ] - }, - "896": { - "error": "Index access is out of bounds", - "op": "extract 2 8 // on error: Index access is out of bounds", - "defined_out": [ - "reinterpret_biguint%0#0" - ], - "stack_out": [ - "reinterpret_biguint%0#0" - ] - }, - "899": { - "op": "bytec 9 // 0x0000000000000000", - "defined_out": [ - "0x0000000000000000", - "reinterpret_biguint%0#0" - ], - "stack_out": [ - "reinterpret_biguint%0#0", - "0x0000000000000000" - ] - }, - "901": { - "op": "b==", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "cond#0" - ] - }, - "902": { - "op": "bnz remove_label_after_if_else@11", - "stack_out": [] - }, - "905": { - "op": "bytec 10 // \"ERR:NOEMPTY\"", - "defined_out": [ - "\"ERR:NOEMPTY\"" - ], - "stack_out": [ - "\"ERR:NOEMPTY\"" - ] - }, - "907": { - "op": "log", - "stack_out": [] - }, - "908": { - "op": "err" - }, - "909": { - "block": "remove_label_after_if_else@11", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "911": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "{box_del}" - ] - }, - "912": { - "op": "pop", - "stack_out": [] - }, - "913": { - "retsub": true, - "op": "retsub" - }, - "914": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", - "params": { - "id#0": "bytes" - }, - "block": "get_label", - "stack_in": [], - "op": "proto 1 1" - }, - "917": { - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "919": { - "op": "box_len", - "defined_out": [ - "cond#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "cond#0" - ] - }, - "920": { - "op": "bury 1", - "stack_out": [ - "cond#0" - ] - }, - "922": { - "op": "bnz get_label_after_if_else@3", - "stack_out": [] - }, - "925": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "\"ERR:NOEXIST\"" - ] - }, - "926": { - "op": "log", - "stack_out": [] - }, - "927": { - "op": "err" - }, - "928": { - "block": "get_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "930": { - "op": "box_get", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "931": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "maybe_value%1#0" - ] - }, - "932": { - "retsub": true, - "op": "retsub" - }, - "933": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", - "params": { - "ids#0": "bytes" - }, - "block": "log_labels", - "stack_in": [], - "op": "proto 1 0" - }, - "936": { - "op": "frame_dig -1", - "defined_out": [ - "ids#0 (copy)" - ], - "stack_out": [ - "ids#0 (copy)" - ] - }, - "938": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "ids#0 (copy)" - ], - "stack_out": [ - "ids#0 (copy)", - "0" - ] - }, - "939": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0" - ] - }, - "940": { - "op": "intc_1 // 0", - "defined_out": [ - "_idx#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0" - ] - }, - "941": { - "block": "log_labels_for_header@1", - "stack_in": [ - "array_length%0#0", - "_idx#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "_idx#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0" - ] - }, - "943": { - "op": "frame_dig 0", - "defined_out": [ - "_idx#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_length%0#0" - ] - }, - "945": { - "op": "<", - "defined_out": [ - "_idx#0", - "array_length%0#0", - "continue_looping%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "continue_looping%0#0" - ] - }, - "946": { - "op": "bz log_labels_after_for@4", - "stack_out": [ - "array_length%0#0", - "_idx#0" - ] - }, - "949": { - "op": "frame_dig -1", - "defined_out": [ - "_idx#0", - "array_length%0#0", - "ids#0 (copy)" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "ids#0 (copy)" - ] - }, - "951": { - "op": "extract 2 0", - "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "array_head_and_tail%0#0" - ] - }, - "954": { - "op": "frame_dig 1", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0" - ] - }, - "956": { - "op": "dup", - "defined_out": [ - "_idx#0", - "_idx#0 (copy)", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0 (copy)", - "_idx#0 (copy)" - ] - }, - "957": { - "op": "cover 2", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0 (copy)" - ] - }, - "959": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "_idx#0", - "_idx#0 (copy)", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "_idx#0 (copy)", - "2" - ] - }, - "960": { - "op": "*", - "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_offset_offset%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0" - ] - }, - "961": { - "op": "dig 1", - "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "item_offset_offset%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "963": { - "op": "swap", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset_offset%0#0" - ] - }, - "964": { - "op": "extract_uint16", - "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_offset%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" - ] - }, - "965": { - "op": "dup2", - "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "item_offset%0#0", - "item_offset%0#0 (copy)" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" - ] - }, - "966": { - "op": "extract_uint16", - "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_length%0#0", - "item_offset%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" - ] - }, - "967": { - "op": "intc_2 // 2", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" - ] - }, - "968": { - "op": "+", - "defined_out": [ - "_idx#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_head_tail_length%0#0", - "item_offset%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" - ] - }, - "969": { - "op": "extract3", - "defined_out": [ - "_idx#0", - "array_length%0#0", - "label_id#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "label_id#0" - ] - }, - "970": { - "op": "extract 2 0", - "defined_out": [ - "_idx#0", - "array_length%0#0", - "tmp%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "tmp%0#0" - ] - }, - "973": { - "op": "box_get", - "defined_out": [ - "_idx#0", - "array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "974": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "maybe_value%0#0" - ] - }, - "975": { - "op": "log", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0" - ] - }, - "976": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "_idx#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0", - "1" - ] - }, - "977": { - "op": "+", - "stack_out": [ - "array_length%0#0", - "_idx#0", - "_idx#0" - ] - }, - "978": { - "op": "frame_bury 1", - "defined_out": [ - "_idx#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_idx#0" - ] - }, - "980": { - "op": "b log_labels_for_header@1" - }, - "983": { - "block": "log_labels_after_for@4", - "stack_in": [ - "array_length%0#0", - "_idx#0" - ], - "retsub": true, - "op": "retsub" - }, - "984": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", - "params": { - "label#0": "bytes" - }, - "block": "admin_or_operator_only", - "stack_in": [], - "op": "proto 1 0" - }, - "987": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "989": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "990": { - "op": "bytec 4 // \"admin\"", - "defined_out": [ - "\"admin\"", - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0", - "\"admin\"" - ] - }, - "992": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "993": { - "error": "check self.admin exists", - "op": "assert // check self.admin exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "994": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "995": { - "op": "bz admin_or_operator_only_after_if_else@2", - "stack_out": [] - }, - "998": { - "retsub": true, - "op": "retsub" - }, - "999": { - "block": "admin_or_operator_only_after_if_else@2", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "label#0 (copy)" - ] - }, - "1001": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "op": "callsub operator_only", - "stack_out": [] - }, - "1004": { - "retsub": true, - "op": "retsub" - }, - "1005": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "params": { - "label#0": "bytes" - }, - "block": "operator_only", - "stack_in": [], - "op": "proto 1 0" - }, - "1008": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1010": { - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "label#0 (copy)" - ] - }, - "1012": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "1015": { - "op": "intc 4 // 4294967296", - "defined_out": [ - "4294967296", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "4294967296" - ] - }, - "1017": { - "op": "!=", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "1018": { - "op": "bz operator_only_bool_false@3", - "stack_out": [] - }, - "1021": { - "op": "txn Sender", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "1023": { - "op": "frame_dig -1", - "stack_out": [ - "tmp%3#0", - "label#0 (copy)" - ] - }, - "1025": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "1028": { - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295", - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0", - "4294967295" - ] - }, - "1029": { - "op": "!=", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "1030": { - "op": "bz operator_only_bool_false@3", - "stack_out": [] - }, - "1033": { - "op": "intc_0 // 1", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "cond#0" - ] - }, - "1034": { - "block": "operator_only_bool_merge@4", - "stack_in": [ - "cond#0" - ], - "op": "bnz operator_only_after_if_else@7", - "defined_out": [], - "stack_out": [] - }, - "1037": { - "op": "bytec 7 // \"ERR:UNAUTH\"", - "defined_out": [ - "\"ERR:UNAUTH\"" - ], - "stack_out": [ - "\"ERR:UNAUTH\"" - ] - }, - "1039": { - "op": "log", - "stack_out": [] - }, - "1040": { - "op": "err" - }, - "1041": { - "block": "operator_only_after_if_else@7", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "1042": { - "block": "operator_only_bool_false@3", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "cond#0" - ] - }, - "1043": { - "op": "b operator_only_bool_merge@4" - }, - "1046": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "params": { - "operator#0": "bytes", - "label#0": "bytes" - }, - "block": "get_operator_label_index", - "stack_in": [], - "op": "proto 2 1" - }, - "1049": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%1#0" - ] - }, - "1050": { - "op": "bytec_2 // \"\"", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0" - ] - }, - "1051": { - "op": "dup", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1052": { - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "operator#0 (copy)" - ] - }, - "1054": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1055": { - "op": "bury 1", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%0#0" - ] - }, - "1057": { - "op": "bnz get_operator_label_index_after_if_else@2", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1060": { - "op": "intc 4 // 4294967296", - "defined_out": [ - "4294967296" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "4294967296" - ] - }, - "1062": { - "op": "frame_bury 0" - }, - "1064": { - "retsub": true, - "op": "retsub" - }, - "1065": { - "block": "get_operator_label_index_after_if_else@2", - "stack_in": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "operator#0 (copy)" - ] - }, - "1067": { - "op": "box_get", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1068": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ] - }, - "1069": { - "op": "dup", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "maybe_value%1#0 (copy)" - ] - }, - "1070": { - "op": "cover 2", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ] - }, - "1072": { - "op": "frame_bury 0", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1074": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ] - }, - "1075": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "0" - ] - }, - "1076": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_length%0#0" - ] - }, - "1077": { - "op": "frame_bury 1", - "defined_out": [ - "array_length%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1079": { - "op": "intc_1 // 0", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1080": { - "op": "frame_bury 2", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1082": { - "block": "get_operator_label_index_for_header@3", - "stack_in": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1084": { - "op": "frame_dig 1", - "defined_out": [ - "array_length%0#0", - "idx#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0", - "array_length%0#0" - ] - }, - "1086": { - "op": "<", - "defined_out": [ - "array_length%0#0", - "continue_looping%0#0", - "idx#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "1087": { - "op": "bz get_operator_label_index_after_for@8", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1090": { - "op": "frame_dig 0", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ] - }, - "1092": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0" - ] - }, - "1095": { - "op": "frame_dig 2", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0" - ] - }, - "1097": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0", - "2" - ] - }, - "1098": { - "op": "*", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0" - ] - }, - "1099": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1101": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset_offset%0#0" - ] - }, - "1102": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" - ] - }, - "1103": { - "op": "dup2", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "item_offset%0#0 (copy)", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" - ] - }, - "1104": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_length%0#0", - "item_offset%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" - ] - }, - "1105": { - "op": "intc_2 // 2", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" - ] - }, - "1106": { - "op": "+", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_head_tail_length%0#0", - "item_offset%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" - ] - }, - "1107": { - "op": "extract3", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "stored_label#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "stored_label#0" - ] - }, - "1108": { - "op": "extract 2 0", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "tmp%2#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "tmp%2#0" - ] - }, - "1111": { - "op": "frame_dig -1", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label#0 (copy)", - "maybe_value%1#0", - "tmp%2#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "tmp%2#0", - "label#0 (copy)" - ] - }, - "1113": { - "op": "==", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "tmp%3#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0" - ] - }, - "1114": { - "op": "bz get_operator_label_index_after_if_else@6", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1117": { - "op": "frame_dig 2", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1119": { - "op": "frame_bury 0" - }, - "1121": { - "retsub": true, - "op": "retsub" - }, - "1122": { - "block": "get_operator_label_index_after_if_else@6", - "stack_in": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1124": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "idx#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0", - "1" - ] - }, - "1125": { - "op": "+", - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1126": { - "op": "frame_bury 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1128": { - "op": "b get_operator_label_index_for_header@3" - }, - "1131": { - "block": "get_operator_label_index_after_for@8", - "stack_in": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295" - ], - "stack_out": [ - "maybe_value%1#0", - "array_length%0#0", - "idx#0", - "4294967295" - ] - }, - "1132": { - "op": "frame_bury 0" - }, - "1134": { - "retsub": true, - "op": "retsub" - }, - "1135": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", - "params": { - "operator#0": "bytes", - "label#0": "bytes" - }, - "block": "add_operator_to_label", - "stack_in": [], - "op": "proto 2 0" - }, - "1138": { - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "label#0 (copy)" - ] - }, - "1140": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", - "op": "callsub admin_or_operator_only", - "stack_out": [] - }, - "1143": { - "op": "frame_dig -1", - "stack_out": [ - "label#0 (copy)" - ] - }, - "1145": { - "op": "box_len", - "defined_out": [ - "cond#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "cond#0" - ] - }, - "1146": { - "op": "bury 1", - "stack_out": [ - "cond#0" - ] - }, - "1148": { - "op": "bnz add_operator_to_label_after_if_else@10", - "stack_out": [] - }, - "1151": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "\"ERR:NOEXIST\"" - ] - }, - "1152": { - "op": "log", - "stack_out": [] - }, - "1153": { - "op": "err" - }, - "1154": { - "block": "add_operator_to_label_after_if_else@10", - "stack_in": [], - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "operator#0 (copy)" - ] - }, - "1156": { - "op": "box_len", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1157": { - "op": "bury 1", - "stack_out": [ - "maybe_exists%1#0" - ] - }, - "1159": { - "op": "bz add_operator_to_label_else_body@2", - "stack_out": [] - }, - "1162": { - "op": "frame_dig -2", - "stack_out": [ - "operator#0 (copy)" - ] - }, - "1164": { - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)", - "operator#0 (copy)" - ], - "stack_out": [ - "operator#0 (copy)", - "label#0 (copy)" - ] - }, - "1166": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "1169": { - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "4294967295" - ] - }, - "1170": { - "op": "==", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "cond#0" - ] - }, - "1171": { - "op": "bnz add_operator_to_label_after_if_else@6", - "stack_out": [] - }, - "1174": { - "op": "bytec 5 // \"ERR:EXISTS\"", - "defined_out": [ - "\"ERR:EXISTS\"" - ], - "stack_out": [ - "\"ERR:EXISTS\"" - ] - }, - "1176": { - "op": "log", - "stack_out": [] - }, - "1177": { - "op": "err" - }, - "1178": { - "block": "add_operator_to_label_after_if_else@6", - "stack_in": [], - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "operator#0 (copy)" - ] - }, - "1180": { - "op": "box_get", - "defined_out": [ - "existing#0", - "maybe_exists%2#0" - ], - "stack_out": [ - "existing#0", - "maybe_exists%2#0" - ] - }, - "1181": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", - "stack_out": [ - "existing#0" - ] - }, - "1182": { - "op": "frame_dig -1", - "defined_out": [ - "existing#0", - "label#0 (copy)" - ], - "stack_out": [ - "existing#0", - "label#0 (copy)" - ] - }, - "1184": { - "op": "len", - "defined_out": [ - "existing#0", - "length%0#0" - ], - "stack_out": [ - "existing#0", - "length%0#0" - ] - }, - "1185": { - "op": "itob", - "defined_out": [ - "as_bytes%0#0", - "existing#0" - ], - "stack_out": [ - "existing#0", - "as_bytes%0#0" - ] - }, - "1186": { - "op": "extract 6 2", - "defined_out": [ - "existing#0", - "length_uint16%0#0" - ], - "stack_out": [ - "existing#0", - "length_uint16%0#0" - ] - }, - "1189": { - "op": "frame_dig -1", - "stack_out": [ - "existing#0", - "length_uint16%0#0", - "label#0 (copy)" - ] - }, - "1191": { - "op": "concat", - "defined_out": [ - "encoded_value%0#0", - "existing#0" - ], - "stack_out": [ - "existing#0", - "encoded_value%0#0" - ] - }, - "1192": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "encoded_value%0#0", - "existing#0" - ], - "stack_out": [ - "existing#0", - "encoded_value%0#0", - "1" - ] - }, - "1193": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", - "stack_out": [ - "existing#0" - ] - }, - "1196": { - "op": "frame_dig -2", - "stack_out": [ - "existing#0", - "operator#0 (copy)" - ] - }, - "1198": { - "op": "box_del", - "defined_out": [ - "existing#0", - "{box_del}" - ], - "stack_out": [ - "existing#0", - "{box_del}" - ] - }, - "1199": { - "op": "pop", - "stack_out": [ - "existing#0" - ] - }, - "1200": { - "op": "frame_dig -2", - "stack_out": [ - "existing#0", - "operator#0 (copy)" - ] - }, - "1202": { - "op": "swap", - "stack_out": [ - "operator#0 (copy)", - "existing#0" - ] - }, - "1203": { - "op": "box_put", - "stack_out": [] - }, - "1204": { - "block": "add_operator_to_label_after_if_else@3", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "label#0 (copy)" - ] - }, - "1206": { - "op": "box_get", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%3#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_exists%3#0" - ] - }, - "1207": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "label_descriptor#0" - ] - }, - "1208": { - "op": "dup", - "defined_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" - ] - }, - "1209": { - "op": "pushint 10 // 10", - "defined_out": [ - "10", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)", - "10" - ] - }, - "1211": { - "op": "extract_uint64", - "defined_out": [ - "label_descriptor#0", - "tmp%9#0" - ], - "stack_out": [ - "label_descriptor#0", - "tmp%9#0" - ] - }, - "1212": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "label_descriptor#0", - "tmp%9#0" - ], - "stack_out": [ - "label_descriptor#0", - "tmp%9#0", - "1" - ] - }, - "1213": { - "op": "+", - "defined_out": [ - "label_descriptor#0", - "to_encode%0#0" - ], - "stack_out": [ - "label_descriptor#0", - "to_encode%0#0" - ] - }, - "1214": { - "op": "itob", - "defined_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" - ] - }, - "1215": { - "op": "replace2 10", - "stack_out": [ - "label_descriptor#0" - ] - }, - "1217": { - "op": "frame_dig -1", - "stack_out": [ - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1219": { - "op": "box_del", - "defined_out": [ - "label_descriptor#0", - "{box_del}" - ], - "stack_out": [ - "label_descriptor#0", - "{box_del}" - ] - }, - "1220": { - "op": "pop", - "stack_out": [ - "label_descriptor#0" - ] - }, - "1221": { - "op": "frame_dig -1", - "stack_out": [ - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1223": { - "op": "swap", - "stack_out": [ - "label#0 (copy)", - "label_descriptor#0" - ] - }, - "1224": { - "op": "box_put", - "stack_out": [] - }, - "1225": { - "retsub": true, - "op": "retsub" - }, - "1226": { - "block": "add_operator_to_label_else_body@2", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "label#0 (copy)" - ] - }, - "1228": { - "op": "len", - "defined_out": [ - "length%1#0" - ], - "stack_out": [ - "length%1#0" - ] - }, - "1229": { - "op": "itob", - "defined_out": [ - "as_bytes%1#0" - ], - "stack_out": [ - "as_bytes%1#0" - ] - }, - "1230": { - "op": "extract 6 2", - "defined_out": [ - "length_uint16%1#0" - ], - "stack_out": [ - "length_uint16%1#0" - ] - }, - "1233": { - "op": "frame_dig -1", - "stack_out": [ - "length_uint16%1#0", - "label#0 (copy)" - ] - }, - "1235": { - "op": "concat", - "defined_out": [ - "encoded_value%1#0" - ], - "stack_out": [ - "encoded_value%1#0" - ] - }, - "1236": { - "op": "bytec 6 // 0x0002", - "defined_out": [ - "0x0002", - "encoded_value%1#0" - ], - "stack_out": [ - "encoded_value%1#0", - "0x0002" - ] - }, - "1238": { - "op": "swap", - "stack_out": [ - "0x0002", - "encoded_value%1#0" - ] - }, - "1239": { - "op": "concat", - "defined_out": [ - "result%1#0" - ], - "stack_out": [ - "result%1#0" - ] - }, - "1240": { - "op": "bytec 11 // 0x0001", - "defined_out": [ - "0x0001", - "result%1#0" - ], - "stack_out": [ - "result%1#0", - "0x0001" - ] - }, - "1242": { - "op": "swap", - "stack_out": [ - "0x0001", - "result%1#0" - ] - }, - "1243": { - "op": "concat", - "defined_out": [ - "array_data%0#0" - ], - "stack_out": [ - "array_data%0#0" - ] - }, - "1244": { - "op": "frame_dig -2", - "defined_out": [ - "array_data%0#0", - "operator#0 (copy)" - ], - "stack_out": [ - "array_data%0#0", - "operator#0 (copy)" - ] - }, - "1246": { - "op": "box_del", - "defined_out": [ - "array_data%0#0", - "{box_del}" - ], - "stack_out": [ - "array_data%0#0", - "{box_del}" - ] - }, - "1247": { - "op": "pop", - "stack_out": [ - "array_data%0#0" - ] - }, - "1248": { - "op": "frame_dig -2", - "stack_out": [ - "array_data%0#0", - "operator#0 (copy)" - ] - }, - "1250": { - "op": "swap", - "stack_out": [ - "operator#0 (copy)", - "array_data%0#0" - ] - }, - "1251": { - "op": "box_put", - "stack_out": [] - }, - "1252": { - "op": "b add_operator_to_label_after_if_else@3" - }, - "1255": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", - "params": { - "operator#0": "bytes", - "label#0": "bytes" - }, - "block": "remove_operator_from_label", - "stack_in": [], - "op": "proto 2 0" - }, - "1258": { - "op": "intc_1 // 0", - "stack_out": [ - "label_descriptor#0" - ] - }, - "1259": { - "op": "dupn 4", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0" - ] - }, - "1261": { - "op": "bytec_2 // \"\"", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0" - ] - }, - "1262": { - "op": "dupn 2", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1264": { - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label#0 (copy)" - ] - }, - "1266": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", - "op": "callsub admin_or_operator_only", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1269": { - "op": "frame_dig -1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label#0 (copy)" - ] - }, - "1271": { - "op": "box_len", - "defined_out": [ - "cond#0", - "maybe_value%0#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%0#0", - "cond#0" - ] - }, - "1272": { - "op": "bury 1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ] - }, - "1274": { - "op": "bnz remove_operator_from_label_after_if_else@28", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1277": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1278": { - "op": "log", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1279": { - "op": "err" - }, - "1280": { - "block": "remove_operator_from_label_after_if_else@28", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)" - ] - }, - "1282": { - "op": "box_len", - "defined_out": [ - "cond#0", - "maybe_value%1#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%1#0", - "cond#0" - ] - }, - "1283": { - "op": "bury 1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ] - }, - "1285": { - "op": "bnz remove_operator_from_label_after_if_else@32", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1288": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1289": { - "op": "log", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1290": { - "op": "err" - }, - "1291": { - "block": "remove_operator_from_label_after_if_else@32", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)" - ] - }, - "1293": { - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)", - "operator#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)", - "label#0 (copy)" - ] - }, - "1295": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", - "defined_out": [ - "label_idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0" - ] - }, - "1298": { - "op": "dup", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0", - "label_idx#0" - ] - }, - "1299": { - "op": "frame_bury 7", - "defined_out": [ - "label_idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0" - ] - }, - "1301": { - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295", - "label_idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0", - "4294967295" - ] - }, - "1302": { - "op": "!=", - "defined_out": [ - "label_idx#0", - "tmp%2#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%2#0" - ] - }, - "1303": { - "op": "bz remove_operator_from_label_bool_false@3", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1306": { - "op": "frame_dig 7", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0" - ] - }, - "1308": { - "op": "intc 4 // 4294967296", - "defined_out": [ - "4294967296", - "label_idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_idx#0", - "4294967296" - ] - }, - "1310": { - "op": "!=", - "defined_out": [ - "label_idx#0", - "tmp%3#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%3#0" - ] - }, - "1311": { - "op": "bz remove_operator_from_label_bool_false@3", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1314": { - "op": "intc_0 // 1", - "defined_out": [ - "cond#0", - "label_idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ] - }, - "1315": { - "block": "remove_operator_from_label_bool_merge@4", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ], - "op": "bnz remove_operator_from_label_after_if_else@24", - "defined_out": [], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1318": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1319": { - "op": "log", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1320": { - "op": "err" - }, - "1321": { - "block": "remove_operator_from_label_after_if_else@24", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label#0 (copy)" - ] - }, - "1323": { - "op": "box_get", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%2#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "maybe_exists%2#0" - ] - }, - "1324": { - "op": "swap", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_exists%2#0", - "label_descriptor#0" - ] - }, - "1325": { - "op": "dup", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_exists%2#0", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ] - }, - "1326": { - "op": "cover 2", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "maybe_exists%2#0", - "label_descriptor#0" - ] - }, - "1328": { - "op": "frame_bury 0", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%2#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "maybe_exists%2#0" - ] - }, - "1330": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0" - ] - }, - "1331": { - "error": "Index access is out of bounds", - "op": "extract 10 8 // on error: Index access is out of bounds", - "defined_out": [ - "label_descriptor#0", - "reinterpret_biguint%0#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%0#0" - ] - }, - "1334": { - "op": "pushbytes 0x0000000000000001", - "defined_out": [ - "0x0000000000000001", - "label_descriptor#0", - "reinterpret_biguint%0#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%0#0", - "0x0000000000000001" - ] - }, - "1344": { - "op": "b>", - "defined_out": [ - "label_descriptor#0", - "tmp%5#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%5#0" - ] - }, - "1345": { - "op": "bnz remove_operator_from_label_bool_true@6", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1348": { - "op": "frame_dig 0", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0" - ] - }, - "1350": { - "error": "Index access is out of bounds", - "op": "extract 2 8 // on error: Index access is out of bounds", - "defined_out": [ - "label_descriptor#0", - "reinterpret_biguint%2#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%2#0" - ] - }, - "1353": { - "op": "bytec 9 // 0x0000000000000000", - "defined_out": [ - "0x0000000000000000", - "label_descriptor#0", - "reinterpret_biguint%2#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "reinterpret_biguint%2#0", - "0x0000000000000000" - ] - }, - "1355": { - "op": "b==", - "defined_out": [ - "label_descriptor#0", - "tmp%6#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%6#0" - ] - }, - "1356": { - "op": "bz remove_operator_from_label_bool_false@7", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1359": { - "block": "remove_operator_from_label_bool_true@6", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "intc_0 // 1", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ] - }, - "1360": { - "block": "remove_operator_from_label_bool_merge@8", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ], - "op": "bnz remove_operator_from_label_after_if_else@20", - "defined_out": [], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1363": { - "op": "bytec 10 // \"ERR:NOEMPTY\"", - "defined_out": [ - "\"ERR:NOEMPTY\"" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "\"ERR:NOEMPTY\"" - ] - }, - "1365": { - "op": "log", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1366": { - "op": "err" - }, - "1367": { - "block": "remove_operator_from_label_after_if_else@20", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "label_descriptor#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0" - ] - }, - "1369": { - "op": "dup", - "defined_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ] - }, - "1370": { - "op": "pushint 10 // 10", - "defined_out": [ - "10", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)", - "10" - ] - }, - "1372": { - "op": "extract_uint64", - "defined_out": [ - "label_descriptor#0", - "tmp%8#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "tmp%8#0" - ] - }, - "1373": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "label_descriptor#0", - "tmp%8#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "tmp%8#0", - "1" - ] - }, - "1374": { - "op": "-", - "defined_out": [ - "label_descriptor#0", - "to_encode%0#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "to_encode%0#0" - ] - }, - "1375": { - "op": "itob", - "defined_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "val_as_bytes%0#0" - ] - }, - "1376": { - "op": "replace2 10", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0" - ] - }, - "1378": { - "op": "frame_dig -1", - "defined_out": [ - "label#0 (copy)", - "label_descriptor#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1380": { - "op": "box_del", - "defined_out": [ - "label_descriptor#0", - "{box_del}" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "{box_del}" - ] - }, - "1381": { - "op": "pop", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0" - ] - }, - "1382": { - "op": "frame_dig -1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1384": { - "op": "swap", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "label#0 (copy)", - "label_descriptor#0" - ] - }, - "1385": { - "op": "box_put", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1386": { - "op": "frame_dig -2", - "defined_out": [ - "label_descriptor#0", - "operator#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)" - ] - }, - "1388": { - "op": "box_get", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1389": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%3#0" - ] - }, - "1390": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "label_descriptor#0", - "maybe_value%3#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%3#0", - "0" - ] - }, - "1391": { - "op": "extract_uint16", - "defined_out": [ - "label_descriptor#0", - "tmp%11#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%11#0" - ] - }, - "1392": { - "op": "intc_0 // 1", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%11#0", - "1" - ] - }, - "1393": { - "op": "==", - "defined_out": [ - "label_descriptor#0", - "tmp%12#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%12#0" - ] - }, - "1394": { - "op": "bz remove_operator_from_label_else_body@10", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1397": { - "op": "frame_dig -2", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)" - ] - }, - "1399": { - "op": "box_del", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "{box_del}" - ] - }, - "1400": { - "op": "pop", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1401": { - "retsub": true, - "op": "retsub" - }, - "1402": { - "block": "remove_operator_from_label_else_body@10", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "bytec_3 // 0x0000", - "defined_out": [ - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "next_list#0" - ] - }, - "1403": { - "op": "frame_bury 2", - "defined_out": [ - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1405": { - "op": "frame_dig -2", - "defined_out": [ - "next_list#0", - "operator#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)" - ] - }, - "1407": { - "op": "box_get", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "1408": { - "op": "swap", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_exists%4#0", - "maybe_value%4#0" - ] - }, - "1409": { - "op": "dup", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "maybe_value%4#0 (copy)" - ] - }, - "1410": { - "op": "cover 2", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "maybe_exists%4#0", - "maybe_value%4#0" - ] - }, - "1412": { - "op": "frame_bury 1", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "1414": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0" - ] - }, - "1415": { - "op": "intc_1 // 0", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "0" - ] - }, - "1416": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0", - "maybe_value%4#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "array_length%0#0" - ] - }, - "1417": { - "op": "frame_bury 5", - "defined_out": [ - "array_length%0#0", - "maybe_value%4#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1419": { - "op": "intc_1 // 0", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0" - ] - }, - "1420": { - "op": "frame_bury 6", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1422": { - "block": "remove_operator_from_label_for_header@11", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig 6", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0" - ] - }, - "1424": { - "op": "frame_dig 5", - "defined_out": [ - "array_length%0#0", - "idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_length%0#0" - ] - }, - "1426": { - "op": "<", - "defined_out": [ - "array_length%0#0", - "continue_looping%0#0", - "idx#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "continue_looping%0#0" - ] - }, - "1427": { - "op": "bz remove_operator_from_label_after_for@16", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1430": { - "op": "frame_dig 1", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0" - ] - }, - "1432": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "array_head_and_tail%0#0" - ] - }, - "1435": { - "op": "frame_dig 6", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "array_head_and_tail%0#0", - "idx#0" - ] - }, - "1437": { - "op": "dup", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "idx#0 (copy)", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "array_head_and_tail%0#0", - "idx#0 (copy)", - "idx#0 (copy)" - ] - }, - "1438": { - "op": "cover 2", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0 (copy)" - ] - }, - "1440": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "idx#0 (copy)", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0 (copy)", - "2" - ] - }, - "1441": { - "op": "*", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0" - ] - }, - "1442": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1444": { - "op": "swap", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset_offset%0#0" - ] - }, - "1445": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" - ] - }, - "1446": { - "op": "dup2", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "item_offset%0#0 (copy)", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" - ] - }, - "1447": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_length%0#0", - "item_offset%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" - ] - }, - "1448": { - "op": "intc_2 // 2", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" - ] - }, - "1449": { - "op": "+", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_head_tail_length%0#0", - "item_offset%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" - ] - }, - "1450": { - "op": "extract3", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "stored_label#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "stored_label#0" - ] - }, - "1451": { - "op": "frame_bury 4", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%4#0", - "stored_label#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0" - ] - }, - "1453": { - "op": "frame_dig 7", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "stored_label#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "label_idx#0" - ] - }, - "1455": { - "op": "!=", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "stored_label#0", - "tmp%15#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%15#0" - ] - }, - "1456": { - "op": "frame_dig 2", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "next_list#9", - "stored_label#0", - "tmp%15#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%15#0", - "next_list#9" - ] - }, - "1458": { - "op": "frame_bury 3", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "next_list#9", - "stored_label#0", - "tmp%15#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "tmp%15#0" - ] - }, - "1460": { - "op": "bz remove_operator_from_label_after_if_else@14", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1463": { - "op": "frame_dig 2", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "next_list#0" - ] - }, - "1465": { - "op": "frame_dig 4", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "next_list#0", - "stored_label#0" - ] - }, - "1467": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "array_length%0#0", - "idx#0", - "label_idx#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "next_list#0", - "stored_label#0", - "1" - ] - }, - "1468": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "next_list#9" - ] - }, - "1471": { - "op": "frame_bury 3", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1473": { - "block": "remove_operator_from_label_after_if_else@14", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig 3", - "defined_out": [ - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "next_list#0" - ] - }, - "1475": { - "op": "frame_bury 2", - "defined_out": [ - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1477": { - "op": "frame_dig 6", - "defined_out": [ - "idx#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0" - ] - }, - "1479": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "idx#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0", - "1" - ] - }, - "1480": { - "op": "+", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "idx#0" - ] - }, - "1481": { - "op": "frame_bury 6", - "defined_out": [ - "idx#0", - "next_list#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1483": { - "op": "b remove_operator_from_label_for_header@11" - }, - "1486": { - "block": "remove_operator_from_label_after_for@16", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)" - ] - }, - "1488": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "{box_del}" - ] - }, - "1489": { - "op": "pop", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1490": { - "op": "frame_dig -2", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)" - ] - }, - "1492": { - "op": "frame_dig 2", - "defined_out": [ - "next_list#0", - "operator#0 (copy)" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "operator#0 (copy)", - "next_list#0" - ] - }, - "1494": { - "op": "box_put", - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ] - }, - "1495": { - "retsub": true, - "op": "retsub" - }, - "1496": { - "block": "remove_operator_from_label_bool_false@7", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "intc_1 // 0", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ] - }, - "1497": { - "op": "b remove_operator_from_label_bool_merge@8" - }, - "1500": { - "block": "remove_operator_from_label_bool_false@3", - "stack_in": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0" - ], - "op": "intc_1 // 0", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "label_descriptor#0", - "maybe_value%4#0", - "next_list#0", - "next_list#9", - "stored_label#0", - "array_length%0#0", - "idx#0", - "label_idx#0", - "cond#0" - ] - }, - "1501": { - "op": "b remove_operator_from_label_bool_merge@4" - }, - "1504": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", - "params": { - "operator#0": "bytes" - }, - "block": "get_operator_labels", - "stack_in": [], - "op": "proto 1 1" - }, - "1507": { - "op": "frame_dig -1", - "defined_out": [ - "operator#0 (copy)" - ], - "stack_out": [ - "operator#0 (copy)" - ] - }, - "1509": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1510": { - "op": "bury 1", - "stack_out": [ - "maybe_exists%0#0" - ] - }, - "1512": { - "op": "bz get_operator_labels_after_if_else@2", - "stack_out": [] - }, - "1515": { - "op": "frame_dig -1", - "stack_out": [ - "operator#0 (copy)" - ] - }, - "1517": { - "op": "box_get", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1518": { - "error": "check self.operators entry exists", - "op": "assert // check self.operators entry exists", - "stack_out": [ - "maybe_value%1#0" - ] - }, - "1519": { - "retsub": true, - "op": "retsub" - }, - "1520": { - "block": "get_operator_labels_after_if_else@2", - "stack_in": [], - "op": "bytec_3 // 0x0000", - "defined_out": [ - "0x0000" - ], - "stack_out": [ - "0x0000" - ] - }, - "1521": { - "retsub": true, - "op": "retsub" - }, - "1522": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", - "params": { - "label#0": "bytes", - "asset#0": "uint64" - }, - "block": "add_label_to_asset", - "stack_in": [], - "op": "proto 2 0" - }, - "1525": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%1#1" - ] - }, - "1526": { - "op": "dup", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0" - ] - }, - "1527": { - "op": "bytec_2 // \"\"", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0" - ] - }, - "1528": { - "op": "dup", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1529": { - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label#0 (copy)" - ] - }, - "1531": { - "op": "box_len", - "defined_out": [ - "cond#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%0#0", - "cond#0" - ] - }, - "1532": { - "op": "bury 1", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "cond#0" - ] - }, - "1534": { - "op": "bnz add_label_to_asset_after_if_else@19", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1537": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1538": { - "op": "log", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1539": { - "op": "err" - }, - "1540": { - "block": "add_label_to_asset_after_if_else@19", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label#0 (copy)" - ] - }, - "1542": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "op": "callsub operator_only", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1545": { - "op": "frame_dig -1", - "defined_out": [ - "asset#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "asset#0 (copy)" - ] - }, - "1547": { - "op": "itob", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0" - ] - }, - "1548": { - "op": "dup", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "tmp%1#0" - ] - }, - "1549": { - "op": "frame_bury 1", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0" - ] - }, - "1551": { - "op": "box_len", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1552": { - "op": "bury 1", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0" - ] - }, - "1554": { - "op": "bz add_label_to_asset_else_body@2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1557": { - "op": "frame_dig 1", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0" - ] - }, - "1559": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#1", - "maybe_value%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#1" - ] - }, - "1560": { - "op": "bury 1", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%0#1" - ] - }, - "1562": { - "op": "bnz add_label_to_asset_after_if_else@6", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1565": { - "op": "intc 4 // 4294967296", - "defined_out": [ - "tmp%1#0", - "tmp%3#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0" - ] - }, - "1567": { - "block": "add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0" - ], - "op": "intc_3 // 4294967295", - "defined_out": [ - "4294967295", - "tmp%3#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0", - "4294967295" - ] - }, - "1568": { - "op": "==", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "cond#0" - ] - }, - "1569": { - "op": "bnz add_label_to_asset_after_if_else@15", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1572": { - "op": "bytec 5 // \"ERR:EXISTS\"", - "defined_out": [ - "\"ERR:EXISTS\"" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "\"ERR:EXISTS\"" - ] - }, - "1574": { - "op": "log", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1575": { - "op": "err" - }, - "1576": { - "block": "add_label_to_asset_after_if_else@15", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0" - ] - }, - "1578": { - "op": "dup", - "defined_out": [ - "tmp%1#0", - "tmp%1#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "tmp%1#0 (copy)" - ] - }, - "1579": { - "op": "box_get", - "defined_out": [ - "existing#0", - "maybe_exists%2#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "maybe_exists%2#0" - ] - }, - "1580": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0" - ] - }, - "1581": { - "op": "frame_dig -2", - "defined_out": [ - "existing#0", - "label#0 (copy)", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "label#0 (copy)" - ] - }, - "1583": { - "op": "len", - "defined_out": [ - "existing#0", - "length%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "length%0#0" - ] - }, - "1584": { - "op": "itob", - "defined_out": [ - "as_bytes%0#0", - "existing#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "as_bytes%0#0" - ] - }, - "1585": { - "op": "extract 6 2", - "defined_out": [ - "existing#0", - "length_uint16%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "length_uint16%0#0" - ] - }, - "1588": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "length_uint16%0#0", - "label#0 (copy)" - ] - }, - "1590": { - "op": "concat", - "defined_out": [ - "encoded_value%0#0", - "existing#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "encoded_value%0#0" - ] - }, - "1591": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "encoded_value%0#0", - "existing#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "encoded_value%0#0", - "1" - ] - }, - "1592": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0" - ] - }, - "1595": { - "op": "dig 1", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "tmp%1#0 (copy)" - ] - }, - "1597": { - "op": "box_del", - "defined_out": [ - "existing#0", - "tmp%1#0", - "{box_del}" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0", - "{box_del}" - ] - }, - "1598": { - "op": "pop", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "existing#0" - ] - }, - "1599": { - "op": "box_put", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1600": { - "block": "add_label_to_asset_after_if_else@3", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label#0 (copy)" - ] - }, - "1602": { - "op": "box_get", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%3#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "maybe_exists%3#0" - ] - }, - "1603": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0" - ] - }, - "1604": { - "op": "dup", - "defined_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ] - }, - "1605": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)", - "2" - ] - }, - "1606": { - "op": "extract_uint64", - "defined_out": [ - "label_descriptor#0", - "tmp%13#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "tmp%13#0" - ] - }, - "1607": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "label_descriptor#0", - "tmp%13#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "tmp%13#0", - "1" - ] - }, - "1608": { - "op": "+", - "defined_out": [ - "label_descriptor#0", - "to_encode%0#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "to_encode%0#0" - ] - }, - "1609": { - "op": "itob", - "defined_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "val_as_bytes%0#0" - ] - }, - "1610": { - "op": "replace2 2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0" - ] - }, - "1612": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1614": { - "op": "box_del", - "defined_out": [ - "label_descriptor#0", - "{box_del}" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "{box_del}" - ] - }, - "1615": { - "op": "pop", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0" - ] - }, - "1616": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1618": { - "op": "swap", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label#0 (copy)", - "label_descriptor#0" - ] - }, - "1619": { - "op": "box_put", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1620": { - "retsub": true, - "op": "retsub" - }, - "1621": { - "block": "add_label_to_asset_after_if_else@6", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0" - ] - }, - "1623": { - "op": "box_get", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#1", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "maybe_exists%1#0" - ] - }, - "1624": { - "op": "swap", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0", - "maybe_value%1#1" - ] - }, - "1625": { - "op": "dup", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_exists%1#0", - "maybe_value%1#1", - "maybe_value%1#1 (copy)" - ] - }, - "1626": { - "op": "cover 2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "maybe_exists%1#0", - "maybe_value%1#1" - ] - }, - "1628": { - "op": "frame_bury 0", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#1", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "maybe_exists%1#0" - ] - }, - "1630": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1" - ] - }, - "1631": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "maybe_value%1#1", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "0" - ] - }, - "1632": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0", - "maybe_value%1#1", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_length%0#0" - ] - }, - "1633": { - "op": "frame_bury 2", - "defined_out": [ - "array_length%0#0", - "maybe_value%1#1", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1635": { - "op": "intc_1 // 0", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1636": { - "op": "frame_bury 3", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1638": { - "block": "add_label_to_asset_for_header@7", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 3", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1640": { - "op": "frame_dig 2", - "defined_out": [ - "array_length%0#0", - "idx#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "idx#0", - "array_length%0#0" - ] - }, - "1642": { - "op": "<", - "defined_out": [ - "array_length%0#0", - "continue_looping%0#0", - "idx#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "1643": { - "op": "bz add_label_to_asset_after_for@11", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1646": { - "op": "frame_dig 0", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1" - ] - }, - "1648": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0" - ] - }, - "1651": { - "op": "frame_dig 3", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0" - ] - }, - "1653": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "idx#0", - "2" - ] - }, - "1654": { - "op": "*", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0" - ] - }, - "1655": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset_offset%0#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset_offset%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1657": { - "op": "swap", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset_offset%0#0" - ] - }, - "1658": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" - ] - }, - "1659": { - "op": "dup2", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "array_length%0#0", - "idx#0", - "item_offset%0#0", - "item_offset%0#0 (copy)", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" - ] - }, - "1660": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_length%0#0", - "item_offset%0#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" - ] - }, - "1661": { - "op": "intc_2 // 2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" - ] - }, - "1662": { - "op": "+", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "idx#0", - "item_head_tail_length%0#0", - "item_offset%0#0", - "maybe_value%1#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" - ] - }, - "1663": { - "op": "extract3", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "stored_label#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "stored_label#0" - ] - }, - "1664": { - "op": "extract 2 0", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%4#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%4#1" - ] - }, - "1667": { - "op": "frame_dig -2", - "defined_out": [ - "array_length%0#0", - "idx#0", - "label#0 (copy)", - "maybe_value%1#1", - "tmp%4#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%4#1", - "label#0 (copy)" - ] - }, - "1669": { - "op": "==", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%5#1" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%5#1" - ] - }, - "1670": { - "op": "bz add_label_to_asset_after_if_else@10", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1673": { - "op": "frame_dig 3", - "defined_out": [ - "array_length%0#0", - "idx#0", - "maybe_value%1#1", - "tmp%3#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0" - ] - }, - "1675": { - "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" - }, - "1678": { - "block": "add_label_to_asset_after_if_else@10", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig 3", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1680": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "idx#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "idx#0", - "1" - ] - }, - "1681": { - "op": "+", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "idx#0" - ] - }, - "1682": { - "op": "frame_bury 3", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1684": { - "op": "b add_label_to_asset_for_header@7" - }, - "1687": { - "block": "add_label_to_asset_after_for@11", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "intc_3 // 4294967295", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%3#0" - ] - }, - "1688": { - "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" - }, - "1691": { - "block": "add_label_to_asset_else_body@2", - "stack_in": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "label#0 (copy)" - ] - }, - "1693": { - "op": "len", - "defined_out": [ - "length%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "length%1#0" - ] - }, - "1694": { - "op": "itob", - "defined_out": [ - "as_bytes%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "as_bytes%1#0" - ] - }, - "1695": { - "op": "extract 6 2", - "defined_out": [ - "length_uint16%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "length_uint16%1#0" - ] - }, - "1698": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "length_uint16%1#0", - "label#0 (copy)" - ] - }, - "1700": { - "op": "concat", - "defined_out": [ - "encoded_value%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "encoded_value%1#0" - ] - }, - "1701": { - "op": "bytec 6 // 0x0002", - "defined_out": [ - "0x0002", - "encoded_value%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "encoded_value%1#0", - "0x0002" - ] - }, - "1703": { - "op": "swap", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "0x0002", - "encoded_value%1#0" - ] - }, - "1704": { - "op": "concat", - "defined_out": [ - "result%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "result%1#0" - ] - }, - "1705": { - "op": "bytec 11 // 0x0001", - "defined_out": [ - "0x0001", - "result%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "result%1#0", - "0x0001" - ] - }, - "1707": { - "op": "swap", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "0x0001", - "result%1#0" - ] - }, - "1708": { - "op": "concat", - "defined_out": [ - "array_data%0#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_data%0#0" - ] - }, - "1709": { - "op": "frame_dig 1", - "defined_out": [ - "array_data%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_data%0#0", - "tmp%1#0" - ] - }, - "1711": { - "op": "dup", - "defined_out": [ - "array_data%0#0", - "tmp%1#0", - "tmp%1#0 (copy)" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_data%0#0", - "tmp%1#0", - "tmp%1#0 (copy)" - ] - }, - "1712": { - "op": "box_del", - "defined_out": [ - "array_data%0#0", - "tmp%1#0", - "{box_del}" - ], - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_data%0#0", - "tmp%1#0", - "{box_del}" - ] - }, - "1713": { - "op": "pop", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "array_data%0#0", - "tmp%1#0" - ] - }, - "1714": { - "op": "swap", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0", - "tmp%1#0", - "array_data%0#0" - ] - }, - "1715": { - "op": "box_put", - "stack_out": [ - "maybe_value%1#1", - "tmp%1#0", - "array_length%0#0", - "idx#0" - ] - }, - "1716": { - "op": "b add_label_to_asset_after_if_else@3" - }, - "1719": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", - "params": { - "label#0": "bytes", - "asset#0": "uint64" - }, - "block": "remove_label_from_asset", - "stack_in": [], - "op": "proto 2 0" - }, - "1722": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%3#0" - ] - }, - "1723": { - "op": "dupn 3", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0" - ] - }, - "1725": { - "op": "bytec_2 // \"\"", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0" - ] - }, - "1726": { - "op": "dupn 2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1728": { - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label#0 (copy)" - ] - }, - "1730": { - "op": "box_len", - "defined_out": [ - "cond#1", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%0#0", - "cond#1" - ] - }, - "1731": { - "op": "bury 1", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "cond#1" - ] - }, - "1733": { - "op": "bnz remove_label_from_asset_after_if_else@20", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1736": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1737": { - "op": "log", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1738": { - "op": "err" - }, - "1739": { - "block": "remove_label_from_asset_after_if_else@20", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label#0 (copy)" - ] - }, - "1741": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", - "op": "callsub operator_only", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1744": { - "op": "intc_1 // 0", - "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "found#0" - ] - }, - "1745": { - "op": "frame_bury 5", - "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1747": { - "op": "frame_dig -1", - "defined_out": [ - "asset#0 (copy)", - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "asset#0 (copy)" - ] - }, - "1749": { - "op": "itob", - "defined_out": [ - "found#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" - ] - }, - "1750": { - "op": "dup", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0", - "tmp%1#0" - ] - }, - "1751": { - "op": "frame_bury 3", - "defined_out": [ - "found#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" - ] - }, - "1753": { - "op": "box_get", - "defined_out": [ - "found#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1754": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%1#0" - ] - }, - "1755": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%1#0", - "0" - ] - }, - "1756": { - "op": "extract_uint16", - "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%3#0" - ] - }, - "1757": { - "op": "intc_0 // 1", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%3#0", - "1" - ] - }, - "1758": { - "op": "==", - "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%4#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%4#0" - ] - }, - "1759": { - "op": "bz remove_label_from_asset_else_body@5", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1762": { - "op": "frame_dig 3", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" - ] - }, - "1764": { - "op": "box_get", - "defined_out": [ - "found#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1765": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%2#0" - ] - }, - "1766": { - "op": "dup", - "defined_out": [ - "found#0", - "maybe_value%2#0", - "maybe_value%2#0 (copy)", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%2#0", - "maybe_value%2#0 (copy)" - ] - }, - "1767": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "maybe_value%2#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%2#0", - "array_head_and_tail%0#0" - ] - }, - "1770": { - "op": "swap", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "maybe_value%2#0" - ] - }, - "1771": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "maybe_value%2#0", - "0" - ] - }, - "1772": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "array_length%0#0", - "found#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "array_length%0#0" - ] - }, - "1773": { - "error": "Index access is out of bounds", - "op": "assert // Index access is out of bounds", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0" - ] - }, - "1774": { - "op": "dup", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "found#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1775": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "0" - ] - }, - "1776": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "item_offset%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0" - ] - }, - "1777": { - "op": "dup2", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "found#0", - "item_offset%0#0", - "item_offset%0#0 (copy)", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%0#0 (copy)" - ] - }, - "1778": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "item_length%0#0", - "item_offset%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0" - ] - }, - "1779": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_head_and_tail%0#0", - "found#0", - "item_length%0#0", - "item_offset%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_length%0#0", - "2" - ] - }, - "1780": { - "op": "+", - "defined_out": [ - "array_head_and_tail%0#0", - "found#0", - "item_head_tail_length%0#0", - "item_offset%0#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%0#0", - "item_offset%0#0", - "item_head_tail_length%0#0" - ] - }, - "1781": { - "op": "extract3", - "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%7#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%7#0" - ] - }, - "1782": { - "op": "extract 2 0", - "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%8#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%8#0" - ] - }, - "1785": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%8#0", - "label#0 (copy)" - ] - }, - "1787": { - "op": "==", - "defined_out": [ - "found#0", - "tmp%1#0", - "tmp%9#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%9#0" - ] - }, - "1788": { - "op": "bz remove_label_from_asset_else_body@3", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1791": { - "op": "frame_dig 3", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" - ] - }, - "1793": { - "op": "box_del", - "defined_out": [ - "found#0", - "tmp%1#0", - "{box_del}" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "{box_del}" - ] - }, - "1794": { - "op": "pop", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1795": { - "op": "intc_0 // 1", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "found#0" - ] - }, - "1796": { - "op": "frame_bury 5", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1798": { - "block": "remove_label_from_asset_after_if_else@13", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "found#0" - ] - }, - "1800": { - "op": "bnz remove_label_from_asset_after_if_else@16", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1803": { - "op": "bytec_0 // \"ERR:NOEXIST\"", - "defined_out": [ - "\"ERR:NOEXIST\"", - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "\"ERR:NOEXIST\"" - ] - }, - "1804": { - "op": "log", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1805": { - "op": "err" - }, - "1806": { - "block": "remove_label_from_asset_after_if_else@16", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig -2", - "defined_out": [ - "label#0 (copy)" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label#0 (copy)" - ] - }, - "1808": { - "op": "box_get", - "defined_out": [ - "label_descriptor#0", - "maybe_exists%4#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "maybe_exists%4#0" - ] - }, - "1809": { - "error": "check self.labels entry exists", - "op": "assert // check self.labels entry exists", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0" - ] - }, - "1810": { - "op": "dup", - "defined_out": [ - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ] - }, - "1811": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "label_descriptor#0", - "label_descriptor#0 (copy)" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "label_descriptor#0 (copy)", - "2" - ] - }, - "1812": { - "op": "extract_uint64", - "defined_out": [ - "label_descriptor#0", - "tmp%20#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "tmp%20#0" - ] - }, - "1813": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "label_descriptor#0", - "tmp%20#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "tmp%20#0", - "1" - ] - }, - "1814": { - "op": "-", - "defined_out": [ - "label_descriptor#0", - "to_encode%0#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "to_encode%0#0" - ] - }, - "1815": { - "op": "itob", - "defined_out": [ - "label_descriptor#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "val_as_bytes%0#0" - ] - }, - "1816": { - "op": "replace2 2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0" - ] - }, - "1818": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1820": { - "op": "box_del", - "defined_out": [ - "label_descriptor#0", - "{box_del}" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "{box_del}" - ] - }, - "1821": { - "op": "pop", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0" - ] - }, - "1822": { - "op": "frame_dig -2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label_descriptor#0", - "label#0 (copy)" - ] - }, - "1824": { - "op": "swap", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "label#0 (copy)", - "label_descriptor#0" - ] - }, - "1825": { - "op": "box_put", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1826": { - "retsub": true, - "op": "retsub" - }, - "1827": { - "block": "remove_label_from_asset_else_body@3", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "intc_1 // 0", - "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "found#0" - ] - }, - "1828": { - "op": "frame_bury 5", - "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1830": { - "op": "b remove_label_from_asset_after_if_else@13" - }, - "1833": { - "block": "remove_label_from_asset_else_body@5", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "bytec_3 // 0x0000", - "defined_out": [ - "next_list#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "next_list#0" - ] - }, - "1834": { - "op": "frame_bury 1", - "defined_out": [ - "next_list#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1836": { - "op": "frame_dig 3", - "defined_out": [ - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" - ] - }, - "1838": { - "op": "box_get", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1839": { - "op": "swap", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_exists%3#0", - "maybe_value%3#0" - ] - }, - "1840": { - "op": "dup", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "maybe_value%3#0 (copy)" - ] - }, - "1841": { - "op": "cover 2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%3#0", - "maybe_exists%3#0", - "maybe_value%3#0" - ] - }, - "1843": { - "op": "frame_bury 0", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1845": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%3#0" - ] - }, - "1846": { - "op": "intc_1 // 0", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%3#0", - "0" - ] - }, - "1847": { - "op": "extract_uint16", - "defined_out": [ - "array_length%1#0", - "maybe_value%3#0", - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_length%1#0" - ] - }, - "1848": { - "op": "frame_bury 4", - "defined_out": [ - "array_length%1#0", - "maybe_value%3#0", - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1850": { - "op": "intc_1 // 0", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "idx#0" - ] - }, - "1851": { - "op": "frame_bury 6", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1853": { - "block": "remove_label_from_asset_for_header@6", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig 6", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "idx#0" - ] - }, - "1855": { - "op": "frame_dig 4", - "defined_out": [ - "array_length%1#0", - "idx#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "idx#0", - "array_length%1#0" - ] - }, - "1857": { - "op": "<", - "defined_out": [ - "array_length%1#0", - "continue_looping%0#0", - "idx#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "1858": { - "op": "bz remove_label_from_asset_after_for@12", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1861": { - "op": "frame_dig 0", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "maybe_value%3#0" - ] - }, - "1863": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0" - ] - }, - "1866": { - "op": "frame_dig 6", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "idx#0" - ] - }, - "1868": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "idx#0", - "2" - ] - }, - "1869": { - "op": "*", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "item_offset_offset%1#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset_offset%1#0" - ] - }, - "1870": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%1#0", - "array_head_and_tail%1#0 (copy)", - "array_length%1#0", - "idx#0", - "item_offset_offset%1#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset_offset%1#0", - "array_head_and_tail%1#0 (copy)" - ] - }, - "1872": { - "op": "swap", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "array_head_and_tail%1#0 (copy)", - "item_offset_offset%1#0" - ] - }, - "1873": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "item_offset%1#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0" - ] - }, - "1874": { - "op": "dup2", - "defined_out": [ - "array_head_and_tail%1#0", - "array_head_and_tail%1#0 (copy)", - "array_length%1#0", - "idx#0", - "item_offset%1#0", - "item_offset%1#0 (copy)", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "array_head_and_tail%1#0 (copy)", - "item_offset%1#0 (copy)" - ] - }, - "1875": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "item_length%1#0", - "item_offset%1#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "item_length%1#0" - ] - }, - "1876": { - "op": "intc_2 // 2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "item_length%1#0", - "2" - ] - }, - "1877": { - "op": "+", - "defined_out": [ - "array_head_and_tail%1#0", - "array_length%1#0", - "idx#0", - "item_head_tail_length%1#0", - "item_offset%1#0", - "maybe_value%3#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "array_head_and_tail%1#0", - "item_offset%1#0", - "item_head_tail_length%1#0" - ] - }, - "1878": { - "op": "extract3", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "stored_label#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "stored_label#0" - ] - }, - "1879": { - "op": "dup", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "stored_label#0", - "stored_label#0" - ] - }, - "1880": { - "op": "frame_bury 2", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "stored_label#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "stored_label#0" - ] - }, - "1882": { - "op": "extract 2 0", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "stored_label#0", - "tmp%14#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%14#0" - ] - }, - "1885": { - "op": "frame_dig -2", - "defined_out": [ - "array_length%1#0", - "idx#0", - "label#0 (copy)", - "maybe_value%3#0", - "stored_label#0", - "tmp%14#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%14#0", - "label#0 (copy)" - ] - }, - "1887": { - "op": "!=", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "stored_label#0", - "tmp%15#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%15#0" - ] - }, - "1888": { - "op": "bz remove_label_from_asset_else_body@9", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1891": { - "op": "frame_dig 1", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "next_list#0", - "stored_label#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "next_list#0" - ] - }, - "1893": { - "op": "frame_dig 2", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "next_list#0", - "stored_label#0" - ] - }, - "1895": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "next_list#0", - "stored_label#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "next_list#0", - "stored_label#0", - "1" - ] - }, - "1896": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", - "op": "callsub dynamic_array_concat_byte_length_head", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "next_list#0" - ] - }, - "1899": { - "op": "frame_bury 1", - "defined_out": [ - "array_length%1#0", - "idx#0", - "maybe_value%3#0", - "next_list#0", - "stored_label#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1901": { - "block": "remove_label_from_asset_after_if_else@10", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig 6", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "idx#0" - ] - }, - "1903": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "idx#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "idx#0", - "1" - ] - }, - "1904": { - "op": "+", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "idx#0" - ] - }, - "1905": { - "op": "frame_bury 6", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1907": { - "op": "b remove_label_from_asset_for_header@6" - }, - "1910": { - "block": "remove_label_from_asset_else_body@9", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "intc_0 // 1", - "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "found#0" - ] - }, - "1911": { - "op": "frame_bury 5", - "defined_out": [ - "found#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1913": { - "op": "b remove_label_from_asset_after_if_else@10" - }, - "1916": { - "block": "remove_label_from_asset_after_for@12", - "stack_in": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ], - "op": "frame_dig 3", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" - ] - }, - "1918": { - "op": "dup", - "defined_out": [ - "tmp%1#0", - "tmp%1#0 (copy)" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0", - "tmp%1#0 (copy)" - ] - }, - "1919": { - "op": "box_del", - "defined_out": [ - "tmp%1#0", - "{box_del}" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0", - "{box_del}" - ] - }, - "1920": { - "op": "pop", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0" - ] - }, - "1921": { - "op": "frame_dig 1", - "defined_out": [ - "next_list#0", - "tmp%1#0" - ], - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0", - "tmp%1#0", - "next_list#0" - ] - }, - "1923": { - "op": "box_put", - "stack_out": [ - "maybe_value%3#0", - "next_list#0", - "stored_label#0", - "tmp%1#0", - "array_length%1#0", - "found#0", - "idx#0" - ] - }, - "1924": { - "op": "b remove_label_from_asset_after_if_else@13" - }, - "1927": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", - "params": { - "asset#0": "uint64" - }, - "block": "get_asset_labels", - "stack_in": [], - "op": "proto 1 1" - }, - "1930": { - "op": "frame_dig -1", - "defined_out": [ - "asset#0 (copy)" - ], - "stack_out": [ - "asset#0 (copy)" - ] - }, - "1932": { - "op": "itob", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1933": { - "op": "dup", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0" - ] - }, - "1934": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1935": { - "op": "bury 1", - "stack_out": [ - "tmp%0#0", - "maybe_exists%0#0" - ] - }, - "1937": { - "op": "bz get_asset_labels_after_if_else@2", - "stack_out": [ - "tmp%0#0" - ] - }, - "1940": { - "op": "frame_dig 0", - "stack_out": [ - "tmp%0#0", - "tmp%0#0" - ] - }, - "1942": { - "op": "box_get", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1943": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%1#0" - ] - }, - "1944": { - "op": "swap" - }, - "1945": { - "retsub": true, - "op": "retsub" - }, - "1946": { - "block": "get_asset_labels_after_if_else@2", - "stack_in": [ - "tmp%0#0" - ], - "op": "bytec_3 // 0x0000", - "defined_out": [ - "0x0000" - ], - "stack_out": [ - "tmp%0#0", - "0x0000" - ] - }, - "1947": { - "op": "swap" - }, - "1948": { - "retsub": true, - "op": "retsub" - }, - "1949": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", - "params": { - "assets#0": "bytes" - }, - "block": "get_assets_labels", - "stack_in": [], - "op": "proto 1 1" - }, - "1952": { - "op": "intc_1 // 0", - "stack_out": [ - "tmp%0#0" - ] - }, - "1953": { - "op": "bytec_3 // 0x0000" - }, - "1954": { - "op": "frame_dig -1" - }, - "1956": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "assets#0 (copy)", - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "assets#0 (copy)", - "0" - ] - }, - "1957": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0", - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0" - ] - }, - "1958": { - "op": "intc_1 // 0", - "defined_out": [ - "_i#0", - "array_length%0#0", - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ] - }, - "1959": { - "block": "get_assets_labels_for_header@1", - "stack_in": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ], - "op": "frame_dig 3", - "defined_out": [ - "_i#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "_i#0" - ] - }, - "1961": { - "op": "frame_dig 2", - "defined_out": [ - "_i#0", - "array_length%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "_i#0", - "array_length%0#0" - ] - }, - "1963": { - "op": "<", - "defined_out": [ - "_i#0", - "array_length%0#0", - "continue_looping%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "continue_looping%0#0" - ] - }, - "1964": { - "op": "bz get_assets_labels_after_for@7", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ] - }, - "1967": { - "op": "frame_dig -1", - "defined_out": [ - "_i#0", - "array_length%0#0", - "assets#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "assets#0 (copy)" - ] - }, - "1969": { - "op": "extract 2 0", - "defined_out": [ - "_i#0", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "array_head_and_tail%0#0" - ] - }, - "1972": { - "op": "frame_dig 3", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "array_head_and_tail%0#0", - "_i#0" - ] - }, - "1974": { - "op": "pushint 8 // 8", - "defined_out": [ - "8", - "_i#0", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "array_head_and_tail%0#0", - "_i#0", - "8" - ] - }, - "1976": { - "op": "*", - "defined_out": [ - "_i#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_offset%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "array_head_and_tail%0#0", - "item_offset%0#0" - ] - }, - "1977": { - "op": "extract_uint64", - "defined_out": [ - "_i#0", - "array_length%0#0", - "asset#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "asset#0" - ] - }, - "1978": { - "op": "itob", - "defined_out": [ - "_i#0", - "array_length%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "tmp%0#0" - ] - }, - "1979": { - "op": "dup", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "tmp%0#0", - "tmp%0#0" - ] - }, - "1980": { - "op": "frame_bury 0", - "defined_out": [ - "_i#0", - "array_length%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "tmp%0#0" - ] - }, - "1982": { - "op": "box_len", - "defined_out": [ - "_i#0", - "array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1983": { - "op": "bury 1", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "maybe_exists%0#0" - ] - }, - "1985": { - "op": "bz get_assets_labels_else_body@4", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ] - }, - "1988": { - "op": "frame_dig 0", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "tmp%0#0" - ] - }, - "1990": { - "op": "box_get", - "defined_out": [ - "_i#0", - "array_length%0#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1991": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "maybe_value%1#0" - ] - }, - "1992": { - "op": "bytec 6 // 0x0002", - "defined_out": [ - "0x0002", - "_i#0", - "array_length%0#0", - "maybe_value%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "maybe_value%1#0", - "0x0002" - ] - }, - "1994": { - "op": "swap", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "0x0002", - "maybe_value%1#0" - ] - }, - "1995": { - "op": "concat", - "defined_out": [ - "_i#0", - "array_length%0#0", - "result%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0" - ] - }, - "1996": { - "op": "frame_dig 1", - "defined_out": [ - "_i#0", - "array_length%0#0", - "out#0", - "result%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0", - "out#0" - ] - }, - "1998": { - "op": "dup", - "defined_out": [ - "_i#0", - "array_length%0#0", - "out#0", - "out#0 (copy)", - "result%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0", - "out#0", - "out#0 (copy)" - ] - }, - "1999": { - "op": "intc_1 // 0", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0", - "out#0", - "out#0 (copy)", - "0" - ] - }, - "2000": { - "op": "extract_uint16", - "defined_out": [ - "_i#0", - "array_length%0#0", - "l_count%0#0", - "out#0", - "result%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0", - "out#0", - "l_count%0#0" - ] - }, - "2001": { - "op": "swap", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0", - "l_count%0#0", - "out#0" - ] - }, - "2002": { - "op": "extract 2 0", - "defined_out": [ - "_i#0", - "array_length%0#0", - "l_count%0#0", - "l_head_and_tail%0#0", - "out#0", - "result%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0", - "l_count%0#0", - "l_head_and_tail%0#0" - ] - }, - "2005": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "_i#0", - "array_length%0#0", - "l_count%0#0", - "l_head_and_tail%0#0", - "out#0", - "result%1#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "result%1#0", - "l_count%0#0", - "l_head_and_tail%0#0", - "1" - ] - }, - "2006": { - "op": "uncover 3", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "l_count%0#0", - "l_head_and_tail%0#0", - "1", - "result%1#0" - ] - }, - "2008": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", - "op": "callsub dynamic_array_concat_dynamic_element", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "out#0" - ] - }, - "2011": { - "op": "frame_bury 1", - "defined_out": [ - "_i#0", - "array_length%0#0", - "out#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ] - }, - "2013": { - "block": "get_assets_labels_after_if_else@5", - "stack_in": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ], - "op": "frame_dig 3", - "defined_out": [ - "_i#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "_i#0" - ] - }, - "2015": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "_i#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "_i#0", - "1" - ] - }, - "2016": { - "op": "+", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "_i#0" - ] - }, - "2017": { - "op": "frame_bury 3", - "defined_out": [ - "_i#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ] - }, - "2019": { - "op": "b get_assets_labels_for_header@1" - }, - "2022": { - "block": "get_assets_labels_else_body@4", - "stack_in": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "out#0" - ] - }, - "2024": { - "op": "dup", - "defined_out": [ - "out#0", - "out#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "out#0", - "out#0 (copy)" - ] - }, - "2025": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "out#0", - "out#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "out#0", - "out#0 (copy)", - "0" - ] - }, - "2026": { - "op": "extract_uint16", - "defined_out": [ - "l_count%1#0", - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "out#0", - "l_count%1#0" - ] - }, - "2027": { - "op": "swap", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "l_count%1#0", - "out#0" - ] - }, - "2028": { - "op": "extract 2 0", - "defined_out": [ - "l_count%1#0", - "l_head_and_tail%1#0", - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "l_count%1#0", - "l_head_and_tail%1#0" - ] - }, - "2031": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "l_count%1#0", - "l_head_and_tail%1#0", - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "l_count%1#0", - "l_head_and_tail%1#0", - "1" - ] - }, - "2032": { - "op": "pushbytes 0x00020000", - "defined_out": [ - "0x00020000", - "1", - "l_count%1#0", - "l_head_and_tail%1#0", - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "l_count%1#0", - "l_head_and_tail%1#0", - "1", - "0x00020000" - ] - }, - "2038": { - "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", - "op": "callsub dynamic_array_concat_dynamic_element", - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "out#0" - ] - }, - "2041": { - "op": "frame_bury 1", - "defined_out": [ - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ] - }, - "2043": { - "op": "b get_assets_labels_after_if_else@5" - }, - "2046": { - "block": "get_assets_labels_after_for@7", - "stack_in": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "out#0" - ], - "stack_out": [ - "tmp%0#0", - "out#0", - "array_length%0#0", - "_i#0", - "out#0" - ] - }, - "2048": { - "op": "frame_bury 0" - }, - "2050": { - "retsub": true, - "op": "retsub" - }, - "2051": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", - "params": { - "asset_id#0": "uint64" - }, - "block": "_get_asset_micro", - "stack_in": [], - "op": "proto 1 1" - }, - "2054": { - "op": "frame_dig -1", - "defined_out": [ - "asset_id#0 (copy)" - ], - "stack_out": [ - "asset_id#0 (copy)" - ] - }, - "2056": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "b#0", - "check%0#0" - ], - "stack_out": [ - "b#0", - "check%0#0" - ] - }, - "2058": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "b#0" - ] - }, - "2059": { - "op": "dup", - "defined_out": [ - "b#0", - "b#0 (copy)" - ], - "stack_out": [ - "b#0", - "b#0 (copy)" - ] - }, - "2060": { - "op": "len", - "defined_out": [ - "b#0", - "length%0#0" - ], - "stack_out": [ - "b#0", - "length%0#0" - ] - }, - "2061": { - "op": "itob", - "defined_out": [ - "as_bytes%0#1", - "b#0" - ], - "stack_out": [ - "b#0", - "as_bytes%0#1" - ] - }, - "2062": { - "op": "extract 6 2", - "defined_out": [ - "b#0", - "length_uint16%0#0" - ], - "stack_out": [ - "b#0", - "length_uint16%0#0" - ] - }, - "2065": { - "op": "swap", - "stack_out": [ - "length_uint16%0#0", - "b#0" - ] - }, - "2066": { - "op": "concat", - "defined_out": [ - "encoded_value%0#0" - ], - "stack_out": [ - "encoded_value%0#0" - ] - }, - "2067": { - "op": "frame_dig -1", - "stack_out": [ - "encoded_value%0#0", - "asset_id#0 (copy)" - ] - }, - "2069": { - "op": "asset_params_get AssetDecimals", - "defined_out": [ - "check%1#0", - "encoded_value%0#0", - "value%1#0" - ], - "stack_out": [ - "encoded_value%0#0", - "value%1#0", - "check%1#0" - ] - }, - "2071": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "encoded_value%0#0", - "value%1#0" - ] - }, - "2072": { - "op": "itob", - "defined_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0" - ] - }, - "2073": { - "op": "dup", - "defined_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%0#0 (copy)" - ], - "stack_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%0#0 (copy)" - ] - }, - "2074": { - "op": "bitlen", - "defined_out": [ - "bitlen%0#0", - "encoded_value%0#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0", - "bitlen%0#0" - ] - }, - "2075": { - "op": "pushint 8 // 8", - "defined_out": [ - "8", - "bitlen%0#0", - "encoded_value%0#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0", - "bitlen%0#0", - "8" - ] - }, - "2077": { - "op": "<=", - "defined_out": [ - "encoded_value%0#0", - "no_overflow%0#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0", - "no_overflow%0#0" - ] - }, - "2078": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "encoded_value%0#0", - "val_as_bytes%0#0" - ] - }, - "2079": { - "op": "extract 7 1", - "defined_out": [ - "encoded_value%0#0", - "uint8%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "uint8%0#0" - ] - }, - "2082": { - "op": "pushbytes 0x0003", - "defined_out": [ - "0x0003", - "encoded_value%0#0", - "uint8%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "uint8%0#0", - "0x0003" - ] - }, - "2086": { - "op": "swap", - "stack_out": [ - "encoded_value%0#0", - "0x0003", - "uint8%0#0" - ] - }, - "2087": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%2#0", - "encoded_value%0#0" - ], - "stack_out": [ - "encoded_value%0#0", - "encoded_tuple_buffer%2#0" - ] - }, - "2088": { - "op": "swap", - "stack_out": [ - "encoded_tuple_buffer%2#0", - "encoded_value%0#0" - ] - }, - "2089": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%3#0" - ], - "stack_out": [ - "encoded_tuple_buffer%3#0" - ] - }, - "2090": { - "retsub": true, - "op": "retsub" - }, - "2091": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", - "params": { - "asset#0": "uint64" - }, - "block": "get_asset_micro", - "stack_in": [], - "op": "proto 1 1" - }, - "2094": { - "op": "frame_dig -1", - "defined_out": [ - "asset#0 (copy)" - ], - "stack_out": [ - "asset#0 (copy)" - ] - }, - "2096": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", - "op": "callsub _get_asset_micro", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2099": { - "retsub": true, - "op": "retsub" - }, - "2100": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", - "params": { - "assets#0": "bytes" - }, - "block": "get_assets_micro", - "stack_in": [], - "op": "proto 1 0" - }, - "2103": { - "op": "frame_dig -1", - "defined_out": [ - "assets#0 (copy)" - ], - "stack_out": [ - "assets#0 (copy)" - ] - }, - "2105": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "assets#0 (copy)" - ], - "stack_out": [ - "assets#0 (copy)", - "0" - ] - }, - "2106": { - "op": "extract_uint16", - "defined_out": [ - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0" - ] - }, - "2107": { - "op": "intc_1 // 0", - "defined_out": [ - "_i#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0" - ] - }, - "2108": { - "block": "get_assets_micro_for_header@1", - "stack_in": [ - "array_length%0#0", - "_i#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "_i#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0" - ] - }, - "2110": { - "op": "frame_dig 0", - "defined_out": [ - "_i#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0", - "array_length%0#0" - ] - }, - "2112": { - "op": "<", - "defined_out": [ - "_i#0", - "array_length%0#0", - "continue_looping%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "continue_looping%0#0" - ] - }, - "2113": { - "op": "bz get_assets_micro_after_for@4", - "stack_out": [ - "array_length%0#0", - "_i#0" - ] - }, - "2116": { - "op": "frame_dig -1", - "defined_out": [ - "_i#0", - "array_length%0#0", - "assets#0 (copy)" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "assets#0 (copy)" - ] - }, - "2118": { - "op": "extract 2 0", - "defined_out": [ - "_i#0", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "array_head_and_tail%0#0" - ] - }, - "2121": { - "op": "frame_dig 1", - "stack_out": [ - "array_length%0#0", - "_i#0", - "array_head_and_tail%0#0", - "_i#0" - ] - }, - "2123": { - "op": "dup", - "defined_out": [ - "_i#0", - "_i#0 (copy)", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "array_head_and_tail%0#0", - "_i#0 (copy)", - "_i#0 (copy)" - ] - }, - "2124": { - "op": "cover 2", - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0", - "array_head_and_tail%0#0", - "_i#0 (copy)" - ] - }, - "2126": { - "op": "pushint 8 // 8", - "defined_out": [ - "8", - "_i#0", - "_i#0 (copy)", - "array_head_and_tail%0#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0", - "array_head_and_tail%0#0", - "_i#0 (copy)", - "8" - ] - }, - "2128": { - "op": "*", - "defined_out": [ - "_i#0", - "array_head_and_tail%0#0", - "array_length%0#0", - "item_offset%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0", - "array_head_and_tail%0#0", - "item_offset%0#0" - ] - }, - "2129": { - "op": "extract_uint64", - "defined_out": [ - "_i#0", - "array_length%0#0", - "tmp%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0", - "tmp%0#0" - ] - }, - "2130": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", - "op": "callsub _get_asset_micro", - "defined_out": [ - "_i#0", - "array_length%0#0", - "tmp%1#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0", - "tmp%1#0" - ] - }, - "2133": { - "op": "log", - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0" - ] - }, - "2134": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "_i#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0", - "1" - ] - }, - "2135": { - "op": "+", - "stack_out": [ - "array_length%0#0", - "_i#0", - "_i#0" - ] - }, - "2136": { - "op": "frame_bury 1", - "defined_out": [ - "_i#0", - "array_length%0#0" - ], - "stack_out": [ - "array_length%0#0", - "_i#0" - ] - }, - "2138": { - "op": "b get_assets_micro_for_header@1" - }, - "2141": { - "block": "get_assets_micro_after_for@4", - "stack_in": [ - "array_length%0#0", - "_i#0" - ], - "retsub": true, - "op": "retsub" - } - } -} \ No newline at end of file diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal deleted file mode 100644 index 3c4c3be..0000000 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal +++ /dev/null @@ -1,2046 +0,0 @@ -#pragma version 10 -#pragma typetrack false - -// smart_contracts.asset_labeling.contract.AssetLabeling.__algopy_entrypoint_with_init() -> uint64: -main: - intcblock 1 0 2 4294967295 4294967296 - bytecblock "ERR:NOEXIST" 0x151f7c75 "" 0x0000 "admin" "ERR:EXISTS" 0x0002 "ERR:UNAUTH" "ERR:LENGTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0001 - txn ApplicationID - bnz main_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:43 - // self.admin = Txn.sender - bytec 4 // "admin" - txn Sender - app_global_put - -main_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txn NumAppArgs - bz main_bare_routing@19 - pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]", method "get_asset_micro(uint64)(string,uint8)", method "get_assets_micro(uint64[])void" - txna ApplicationArgs 0 - match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 - -main_after_if_else@21: - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - intc_1 // 0 - return - -main_get_assets_micro_route@18: - // smart_contracts/asset_labeling/contract.py:293 - // @abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:293 - // @abimethod(readonly=True) - callsub get_assets_micro - intc_0 // 1 - return - -main_get_asset_micro_route@17: - // smart_contracts/asset_labeling/contract.py:289 - // @abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - btoi - // smart_contracts/asset_labeling/contract.py:289 - // @abimethod(readonly=True) - callsub get_asset_micro - bytec_1 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -main_get_assets_labels_route@16: - // smart_contracts/asset_labeling/contract.py:267 - // @abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:267 - // @abimethod(readonly=True) - callsub get_assets_labels - bytec_1 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -main_get_asset_labels_route@15: - // smart_contracts/asset_labeling/contract.py:260 - // @abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - btoi - txnas Assets - // smart_contracts/asset_labeling/contract.py:260 - // @abimethod(readonly=True) - callsub get_asset_labels - bytec_1 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -main_remove_label_from_asset_route@14: - // smart_contracts/asset_labeling/contract.py:226 - // @abimethod() - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - extract 2 0 - txna ApplicationArgs 2 - btoi - txnas Assets - // smart_contracts/asset_labeling/contract.py:226 - // @abimethod() - callsub remove_label_from_asset - intc_0 // 1 - return - -main_add_label_to_asset_route@13: - // smart_contracts/asset_labeling/contract.py:198 - // @abimethod() - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - extract 2 0 - txna ApplicationArgs 2 - btoi - txnas Assets - // smart_contracts/asset_labeling/contract.py:198 - // @abimethod() - callsub add_label_to_asset - intc_0 // 1 - return - -main_get_operator_labels_route@12: - // smart_contracts/asset_labeling/contract.py:182 - // @abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - btoi - txnas Accounts - // smart_contracts/asset_labeling/contract.py:182 - // @abimethod(readonly=True) - callsub get_operator_labels - bytec_1 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -main_remove_operator_from_label_route@11: - // smart_contracts/asset_labeling/contract.py:141 - // @abimethod() - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - btoi - txnas Accounts - txna ApplicationArgs 2 - extract 2 0 - // smart_contracts/asset_labeling/contract.py:141 - // @abimethod() - callsub remove_operator_from_label - intc_0 // 1 - return - -main_add_operator_to_label_route@10: - // smart_contracts/asset_labeling/contract.py:113 - // @abimethod() - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - btoi - txnas Accounts - txna ApplicationArgs 2 - extract 2 0 - // smart_contracts/asset_labeling/contract.py:113 - // @abimethod() - callsub add_operator_to_label - intc_0 // 1 - return - -main_log_labels_route@9: - // smart_contracts/asset_labeling/contract.py:82 - // @abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:82 - // @abimethod(readonly=True) - callsub log_labels - intc_0 // 1 - return - -main_get_label_route@8: - // smart_contracts/asset_labeling/contract.py:77 - // @abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - extract 2 0 - // smart_contracts/asset_labeling/contract.py:77 - // @abimethod(readonly=True) - callsub get_label - bytec_1 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -main_remove_label_route@7: - // smart_contracts/asset_labeling/contract.py:69 - // @abimethod() - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - extract 2 0 - // smart_contracts/asset_labeling/contract.py:69 - // @abimethod() - callsub remove_label - intc_0 // 1 - return - -main_add_label_route@6: - // smart_contracts/asset_labeling/contract.py:58 - // @abimethod() - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - extract 2 0 - txna ApplicationArgs 2 - extract 2 0 - // smart_contracts/asset_labeling/contract.py:58 - // @abimethod() - callsub add_label - intc_0 // 1 - return - -main_change_admin_route@5: - // smart_contracts/asset_labeling/contract.py:53 - // @abimethod() - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txna ApplicationArgs 1 - btoi - txnas Accounts - // smart_contracts/asset_labeling/contract.py:53 - // @abimethod() - callsub change_admin - intc_0 // 1 - return - -main_bare_routing@19: - // smart_contracts/asset_labeling/contract.py:41 - // class AssetLabeling(ARC4Contract): - txn OnCompletion - bnz main_after_if_else@21 - txn ApplicationID - ! - assert // can only call when creating - intc_0 // 1 - return - - -// _puya_lib.arc4.dynamic_array_concat_byte_length_head(array: bytes, new_items_bytes: bytes, new_items_count: uint64) -> bytes: -dynamic_array_concat_byte_length_head: - proto 3 1 - frame_dig -3 - intc_1 // 0 - extract_uint16 - dup - frame_dig -1 - + - swap - intc_2 // 2 - * - intc_2 // 2 - + - dig 1 - itob - extract 6 2 - cover 2 - frame_dig -3 - intc_2 // 2 - dig 2 - substring3 - frame_dig -1 - intc_2 // 2 - * - bzero - concat - frame_dig -3 - len - frame_dig -3 - uncover 3 - uncover 2 - substring3 - concat - frame_dig -2 - concat - swap - intc_2 // 2 - * - dup - intc_1 // 0 - swap - -dynamic_array_concat_byte_length_head_for_header@2: - frame_dig 3 - frame_dig 2 - < - bz dynamic_array_concat_byte_length_head_after_for@5 - frame_dig 4 - dup - itob - extract 6 2 - frame_dig 1 - frame_dig 3 - dup - cover 4 - uncover 2 - replace3 - dup - frame_bury 1 - dig 1 - extract_uint16 - intc_2 // 2 - + - + - frame_bury 4 - intc_2 // 2 - + - frame_bury 3 - b dynamic_array_concat_byte_length_head_for_header@2 - -dynamic_array_concat_byte_length_head_after_for@5: - frame_dig 0 - frame_dig 1 - concat - frame_bury 0 - retsub - - -// _puya_lib.arc4.dynamic_array_concat_dynamic_element(array_items_count: uint64, array_head_and_tail: bytes, new_items_count: uint64, new_head_and_tail: bytes) -> bytes: -dynamic_array_concat_dynamic_element: - proto 4 1 - bytec_2 // "" - dup - frame_dig -2 - intc_2 // 2 - * - frame_dig -4 - intc_2 // 2 - * - intc_1 // 0 - -dynamic_array_concat_dynamic_element_for_header@1: - frame_dig 4 - frame_dig 3 - < - bz dynamic_array_concat_dynamic_element_after_for@4 - frame_dig -3 - frame_dig 4 - dup - cover 2 - extract_uint16 - frame_dig 2 - + - itob - extract 6 2 - frame_dig 1 - swap - concat - frame_bury 1 - intc_2 // 2 - + - frame_bury 4 - b dynamic_array_concat_dynamic_element_for_header@1 - -dynamic_array_concat_dynamic_element_after_for@4: - frame_dig -3 - len - frame_bury 0 - intc_1 // 0 - frame_bury 4 - -dynamic_array_concat_dynamic_element_for_header@5: - frame_dig 4 - frame_dig 2 - < - bz dynamic_array_concat_dynamic_element_after_for@8 - frame_dig -1 - frame_dig 4 - dup - cover 2 - extract_uint16 - frame_dig 0 - + - itob - extract 6 2 - frame_dig 1 - swap - concat - frame_bury 1 - intc_2 // 2 - + - frame_bury 4 - b dynamic_array_concat_dynamic_element_for_header@5 - -dynamic_array_concat_dynamic_element_after_for@8: - frame_dig -4 - frame_dig -2 - + - itob - extract 6 2 - frame_dig 1 - concat - frame_dig -3 - frame_dig 3 - frame_dig 0 - substring3 - concat - frame_dig -1 - len - frame_dig -1 - frame_dig 2 - uncover 2 - substring3 - concat - frame_bury 0 - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.admin_only() -> void: -admin_only: - // smart_contracts/asset_labeling/contract.py:51 - // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) - txn Sender - intc_1 // 0 - bytec 4 // "admin" - app_global_get_ex - assert // check self.admin exists - == - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz admin_only_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:51 - // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) - bytec 7 // "ERR:UNAUTH" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -admin_only_after_if_else@3: - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.change_admin(new_admin: bytes) -> void: -change_admin: - // smart_contracts/asset_labeling/contract.py:53-54 - // @abimethod() - // def change_admin(self, new_admin: Account) -> None: - proto 1 0 - // smart_contracts/asset_labeling/contract.py:55 - // self.admin_only() - callsub admin_only - // smart_contracts/asset_labeling/contract.py:56 - // self.admin = new_admin - bytec 4 // "admin" - frame_dig -1 - app_global_put - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.add_label(id: bytes, name: bytes) -> void: -add_label: - // smart_contracts/asset_labeling/contract.py:58-59 - // @abimethod() - // def add_label(self, id: String, name: String) -> None: - proto 2 0 - // smart_contracts/asset_labeling/contract.py:60 - // self.admin_only() - callsub admin_only - // smart_contracts/asset_labeling/contract.py:61 - // ensure(id not in self.labels, S("ERR:EXISTS")) - frame_dig -2 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bz add_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:61 - // ensure(id not in self.labels, S("ERR:EXISTS")) - bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -add_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:62 - // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - frame_dig -2 - len - intc_2 // 2 - == - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz add_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:62 - // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - bytec 8 // "ERR:LENGTH" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -add_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:64 - // arc4.String(name), - frame_dig -1 - len - itob - extract 6 2 - frame_dig -1 - concat - // smart_contracts/asset_labeling/contract.py:63-67 - // self.labels[id] = LabelDescriptor( - // arc4.String(name), - // arc4.UInt64(0), - // arc4.UInt64(0), - // ) - pushbytes 0x001200000000000000000000000000000000 - swap - concat - frame_dig -2 - box_del - pop - frame_dig -2 - swap - box_put - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.remove_label(id: bytes) -> void: -remove_label: - // smart_contracts/asset_labeling/contract.py:69-70 - // @abimethod() - // def remove_label(self, id: String) -> None: - proto 1 0 - // smart_contracts/asset_labeling/contract.py:71 - // self.admin_only() - callsub admin_only - // smart_contracts/asset_labeling/contract.py:72 - // ensure(id in self.labels, S("ERR:NOEXIST")) - frame_dig -1 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:72 - // ensure(id in self.labels, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:73 - // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - frame_dig -1 - len - intc_2 // 2 - == - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:73 - // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - bytec 8 // "ERR:LENGTH" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:74 - // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) - frame_dig -1 - box_get - assert // check self.labels entry exists - extract 2 8 // on error: Index access is out of bounds - bytec 9 // 0x0000000000000000 - b== - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_label_after_if_else@11 - // smart_contracts/asset_labeling/contract.py:74 - // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) - bytec 10 // "ERR:NOEMPTY" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_label_after_if_else@11: - // smart_contracts/asset_labeling/contract.py:75 - // del self.labels[id] - frame_dig -1 - box_del - pop - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.get_label(id: bytes) -> bytes: -get_label: - // smart_contracts/asset_labeling/contract.py:77-78 - // @abimethod(readonly=True) - // def get_label(self, id: String) -> LabelDescriptor: - proto 1 1 - // smart_contracts/asset_labeling/contract.py:79 - // ensure(id in self.labels, S("ERR:NOEXIST")) - frame_dig -1 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz get_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:79 - // ensure(id in self.labels, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -get_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:80 - // return self.labels[id] - frame_dig -1 - box_get - assert // check self.labels entry exists - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.log_labels(ids: bytes) -> void: -log_labels: - // smart_contracts/asset_labeling/contract.py:82-83 - // @abimethod(readonly=True) - // def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: - proto 1 0 - // smart_contracts/asset_labeling/contract.py:84 - // for _idx, label_id in uenumerate(ids): - frame_dig -1 - intc_1 // 0 - extract_uint16 - intc_1 // 0 - -log_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:84 - // for _idx, label_id in uenumerate(ids): - frame_dig 1 - frame_dig 0 - < - bz log_labels_after_for@4 - frame_dig -1 - extract 2 0 - frame_dig 1 - dup - cover 2 - intc_2 // 2 - * - dig 1 - swap - extract_uint16 - dup2 - extract_uint16 - intc_2 // 2 - + - extract3 - // smart_contracts/asset_labeling/contract.py:85 - // log(self.labels[label_id.native]) - extract 2 0 - box_get - assert // check self.labels entry exists - log - intc_0 // 1 - + - frame_bury 1 - b log_labels_for_header@1 - -log_labels_after_for@4: - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only(label: bytes) -> void: -admin_or_operator_only: - // smart_contracts/asset_labeling/contract.py:89-90 - // @subroutine - // def admin_or_operator_only(self, label: String) -> None: - proto 1 0 - // smart_contracts/asset_labeling/contract.py:91 - // if Txn.sender == self.admin: - txn Sender - intc_1 // 0 - bytec 4 // "admin" - app_global_get_ex - assert // check self.admin exists - == - bz admin_or_operator_only_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:92 - // return - retsub - -admin_or_operator_only_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:93 - // self.operator_only(label) - frame_dig -1 - callsub operator_only - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.operator_only(label: bytes) -> void: -operator_only: - // smart_contracts/asset_labeling/contract.py:95-96 - // @subroutine - // def operator_only(self, label: String) -> None: - proto 1 0 - // smart_contracts/asset_labeling/contract.py:98 - // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) - txn Sender - frame_dig -1 - callsub get_operator_label_index - intc 4 // 4294967296 - != - // smart_contracts/asset_labeling/contract.py:98-100 - // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) - // and self.get_operator_label_index(Txn.sender, label) - // != UInt64(NOT_FOUND_VALUE), - bz operator_only_bool_false@3 - // smart_contracts/asset_labeling/contract.py:99 - // and self.get_operator_label_index(Txn.sender, label) - txn Sender - frame_dig -1 - callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:100 - // != UInt64(NOT_FOUND_VALUE), - intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:99-100 - // and self.get_operator_label_index(Txn.sender, label) - // != UInt64(NOT_FOUND_VALUE), - != - // smart_contracts/asset_labeling/contract.py:98-100 - // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) - // and self.get_operator_label_index(Txn.sender, label) - // != UInt64(NOT_FOUND_VALUE), - bz operator_only_bool_false@3 - intc_0 // 1 - -operator_only_bool_merge@4: - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz operator_only_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:101 - // S("ERR:UNAUTH"), - bytec 7 // "ERR:UNAUTH" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -operator_only_after_if_else@7: - retsub - -operator_only_bool_false@3: - intc_1 // 0 - b operator_only_bool_merge@4 - - -// smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index(operator: bytes, label: bytes) -> uint64: -get_operator_label_index: - // smart_contracts/asset_labeling/contract.py:104-105 - // @subroutine - // def get_operator_label_index(self, operator: Account, label: String) -> UInt64: - proto 2 1 - intc_1 // 0 - bytec_2 // "" - dup - // smart_contracts/asset_labeling/contract.py:106 - // if operator not in self.operators: - frame_dig -2 - box_len - bury 1 - bnz get_operator_label_index_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:107 - // return UInt64(NOT_FOUND_KEY) - intc 4 // 4294967296 - frame_bury 0 - retsub - -get_operator_label_index_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:108 - // for idx, stored_label in uenumerate(self.operators[operator]): - frame_dig -2 - box_get - swap - dup - cover 2 - frame_bury 0 - assert // check self.operators entry exists - intc_1 // 0 - extract_uint16 - frame_bury 1 - intc_1 // 0 - frame_bury 2 - -get_operator_label_index_for_header@3: - // smart_contracts/asset_labeling/contract.py:108 - // for idx, stored_label in uenumerate(self.operators[operator]): - frame_dig 2 - frame_dig 1 - < - bz get_operator_label_index_after_for@8 - frame_dig 0 - extract 2 0 - frame_dig 2 - intc_2 // 2 - * - dig 1 - swap - extract_uint16 - dup2 - extract_uint16 - intc_2 // 2 - + - extract3 - // smart_contracts/asset_labeling/contract.py:109 - // if stored_label == label: - extract 2 0 - frame_dig -1 - == - bz get_operator_label_index_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:110 - // return idx - frame_dig 2 - frame_bury 0 - retsub - -get_operator_label_index_after_if_else@6: - frame_dig 2 - intc_0 // 1 - + - frame_bury 2 - b get_operator_label_index_for_header@3 - -get_operator_label_index_after_for@8: - // smart_contracts/asset_labeling/contract.py:111 - // return UInt64(NOT_FOUND_VALUE) - intc_3 // 4294967295 - frame_bury 0 - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label(operator: bytes, label: bytes) -> void: -add_operator_to_label: - // smart_contracts/asset_labeling/contract.py:113-114 - // @abimethod() - // def add_operator_to_label(self, operator: Account, label: String) -> None: - proto 2 0 - // smart_contracts/asset_labeling/contract.py:115 - // self.admin_or_operator_only(label) - frame_dig -1 - callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:116 - // ensure(label in self.labels, S("ERR:NOEXIST")) - frame_dig -1 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz add_operator_to_label_after_if_else@10 - // smart_contracts/asset_labeling/contract.py:116 - // ensure(label in self.labels, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -add_operator_to_label_after_if_else@10: - // smart_contracts/asset_labeling/contract.py:117-118 - // # check if operator exists already - // if operator in self.operators: - frame_dig -2 - box_len - bury 1 - bz add_operator_to_label_else_body@2 - // smart_contracts/asset_labeling/contract.py:121 - // self.get_operator_label_index(operator, label) - frame_dig -2 - frame_dig -1 - callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:122 - // == UInt64(NOT_FOUND_VALUE), - intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:121-122 - // self.get_operator_label_index(operator, label) - // == UInt64(NOT_FOUND_VALUE), - == - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz add_operator_to_label_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:123 - // S("ERR:EXISTS"), - bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -add_operator_to_label_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:126-127 - // # add label to operator - // existing = self.operators[operator].copy() - frame_dig -2 - box_get - assert // check self.operators entry exists - // smart_contracts/asset_labeling/contract.py:128 - // existing.append(arc4.String(label)) - frame_dig -1 - len - itob - extract 6 2 - frame_dig -1 - concat - intc_0 // 1 - callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:129 - // self.operators[operator] = existing.copy() - frame_dig -2 - box_del - pop - frame_dig -2 - swap - box_put - -add_operator_to_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:134-135 - // # increment label operators - // label_descriptor = self.labels[label].copy() - frame_dig -1 - box_get - assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:137 - // label_descriptor.num_operators.native + UInt64(1) - dup - pushint 10 // 10 - extract_uint64 - intc_0 // 1 - + - // smart_contracts/asset_labeling/contract.py:136-138 - // label_descriptor.num_operators = arc4.UInt64( - // label_descriptor.num_operators.native + UInt64(1) - // ) - itob - replace2 10 - // smart_contracts/asset_labeling/contract.py:139 - // self.labels[label] = label_descriptor.copy() - frame_dig -1 - box_del - pop - frame_dig -1 - swap - box_put - retsub - -add_operator_to_label_else_body@2: - // smart_contracts/asset_labeling/contract.py:131-132 - // # new operator, create new box - // self.operators[operator] = arc4.DynamicArray(arc4.String(label)) - frame_dig -1 - len - itob - extract 6 2 - frame_dig -1 - concat - bytec 6 // 0x0002 - swap - concat - bytec 11 // 0x0001 - swap - concat - frame_dig -2 - box_del - pop - frame_dig -2 - swap - box_put - b add_operator_to_label_after_if_else@3 - - -// smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label(operator: bytes, label: bytes) -> void: -remove_operator_from_label: - // smart_contracts/asset_labeling/contract.py:141-142 - // @abimethod() - // def remove_operator_from_label(self, operator: Account, label: String) -> None: - proto 2 0 - intc_1 // 0 - dupn 4 - bytec_2 // "" - dupn 2 - // smart_contracts/asset_labeling/contract.py:143 - // self.admin_or_operator_only(label) - frame_dig -1 - callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:145 - // ensure(label in self.labels, S("ERR:NOEXIST")) - frame_dig -1 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_operator_from_label_after_if_else@28 - // smart_contracts/asset_labeling/contract.py:145 - // ensure(label in self.labels, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_operator_from_label_after_if_else@28: - // smart_contracts/asset_labeling/contract.py:146 - // ensure(operator in self.operators, S("ERR:NOEXIST")) - frame_dig -2 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_operator_from_label_after_if_else@32 - // smart_contracts/asset_labeling/contract.py:146 - // ensure(operator in self.operators, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_operator_from_label_after_if_else@32: - // smart_contracts/asset_labeling/contract.py:148-149 - // # ensure label exists in operator - // label_idx = self.get_operator_label_index(operator, label) - frame_dig -2 - frame_dig -1 - callsub get_operator_label_index - dup - frame_bury 7 - // smart_contracts/asset_labeling/contract.py:151 - // label_idx != UInt64(NOT_FOUND_VALUE) - intc_3 // 4294967295 - != - // smart_contracts/asset_labeling/contract.py:151-153 - // label_idx != UInt64(NOT_FOUND_VALUE) - // and label_idx - // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above - bz remove_operator_from_label_bool_false@3 - // smart_contracts/asset_labeling/contract.py:152-153 - // and label_idx - // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above - frame_dig 7 - // smart_contracts/asset_labeling/contract.py:153 - // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above - intc 4 // 4294967296 - // smart_contracts/asset_labeling/contract.py:152-153 - // and label_idx - // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above - != - // smart_contracts/asset_labeling/contract.py:151-153 - // label_idx != UInt64(NOT_FOUND_VALUE) - // and label_idx - // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above - bz remove_operator_from_label_bool_false@3 - intc_0 // 1 - -remove_operator_from_label_bool_merge@4: - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_operator_from_label_after_if_else@24 - // smart_contracts/asset_labeling/contract.py:154 - // S("ERR:NOEXIST"), - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_operator_from_label_after_if_else@24: - // smart_contracts/asset_labeling/contract.py:157-158 - // # ensure only empty labels can be left operator-less - // label_descriptor = self.labels[label].copy() - frame_dig -1 - box_get - swap - dup - cover 2 - frame_bury 0 - assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:160 - // label_descriptor.num_operators > 1 or label_descriptor.num_assets == 0, - extract 10 8 // on error: Index access is out of bounds - pushbytes 0x0000000000000001 - b> - bnz remove_operator_from_label_bool_true@6 - frame_dig 0 - extract 2 8 // on error: Index access is out of bounds - bytec 9 // 0x0000000000000000 - b== - bz remove_operator_from_label_bool_false@7 - -remove_operator_from_label_bool_true@6: - intc_0 // 1 - -remove_operator_from_label_bool_merge@8: - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_operator_from_label_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:161 - // S("ERR:NOEMPTY"), - bytec 10 // "ERR:NOEMPTY" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_operator_from_label_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:165 - // label_descriptor.num_operators.native - UInt64(1) - frame_dig 0 - dup - pushint 10 // 10 - extract_uint64 - intc_0 // 1 - - - // smart_contracts/asset_labeling/contract.py:163-166 - // # decr operator count - // label_descriptor.num_operators = arc4.UInt64( - // label_descriptor.num_operators.native - UInt64(1) - // ) - itob - replace2 10 - // smart_contracts/asset_labeling/contract.py:167 - // self.labels[label] = label_descriptor.copy() - frame_dig -1 - box_del - pop - frame_dig -1 - swap - box_put - // smart_contracts/asset_labeling/contract.py:169 - // if self.operators[operator].length == 1: - frame_dig -2 - box_get - assert // check self.operators entry exists - intc_1 // 0 - extract_uint16 - intc_0 // 1 - == - bz remove_operator_from_label_else_body@10 - // smart_contracts/asset_labeling/contract.py:170 - // del self.operators[operator] - frame_dig -2 - box_del - pop - retsub - -remove_operator_from_label_else_body@10: - // smart_contracts/asset_labeling/contract.py:172 - // next_list = arc4.DynamicArray[arc4.String]() - bytec_3 // 0x0000 - frame_bury 2 - // smart_contracts/asset_labeling/contract.py:173-176 - // # walk, push everything except index - // # this implementation walks twice (once in get_operator_label_index) - // # could be more efficient - // for idx, stored_label in uenumerate(self.operators[operator]): - frame_dig -2 - box_get - swap - dup - cover 2 - frame_bury 1 - assert // check self.operators entry exists - intc_1 // 0 - extract_uint16 - frame_bury 5 - intc_1 // 0 - frame_bury 6 - -remove_operator_from_label_for_header@11: - // smart_contracts/asset_labeling/contract.py:173-176 - // # walk, push everything except index - // # this implementation walks twice (once in get_operator_label_index) - // # could be more efficient - // for idx, stored_label in uenumerate(self.operators[operator]): - frame_dig 6 - frame_dig 5 - < - bz remove_operator_from_label_after_for@16 - frame_dig 1 - extract 2 0 - frame_dig 6 - dup - cover 2 - intc_2 // 2 - * - dig 1 - swap - extract_uint16 - dup2 - extract_uint16 - intc_2 // 2 - + - extract3 - frame_bury 4 - // smart_contracts/asset_labeling/contract.py:177 - // if label_idx != idx: - frame_dig 7 - != - frame_dig 2 - frame_bury 3 - bz remove_operator_from_label_after_if_else@14 - // smart_contracts/asset_labeling/contract.py:178 - // next_list.append(stored_label) - frame_dig 2 - frame_dig 4 - intc_0 // 1 - callsub dynamic_array_concat_byte_length_head - frame_bury 3 - -remove_operator_from_label_after_if_else@14: - frame_dig 3 - frame_bury 2 - frame_dig 6 - intc_0 // 1 - + - frame_bury 6 - b remove_operator_from_label_for_header@11 - -remove_operator_from_label_after_for@16: - // smart_contracts/asset_labeling/contract.py:180 - // self.operators[operator] = next_list.copy() - frame_dig -2 - box_del - pop - frame_dig -2 - frame_dig 2 - box_put - retsub - -remove_operator_from_label_bool_false@7: - intc_1 // 0 - b remove_operator_from_label_bool_merge@8 - -remove_operator_from_label_bool_false@3: - intc_1 // 0 - b remove_operator_from_label_bool_merge@4 - - -// smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels(operator: bytes) -> bytes: -get_operator_labels: - // smart_contracts/asset_labeling/contract.py:182-183 - // @abimethod(readonly=True) - // def get_operator_labels(self, operator: Account) -> LabelList: - proto 1 1 - // smart_contracts/asset_labeling/contract.py:184 - // if operator in self.operators: - frame_dig -1 - box_len - bury 1 - bz get_operator_labels_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:185 - // return self.operators[operator] - frame_dig -1 - box_get - assert // check self.operators entry exists - retsub - -get_operator_labels_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:33 - // return arc4.DynamicArray[arc4.String]() - bytec_3 // 0x0000 - // smart_contracts/asset_labeling/contract.py:186-187 - // # return empty list - // return empty_list() - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset(label: bytes, asset: uint64) -> void: -add_label_to_asset: - // smart_contracts/asset_labeling/contract.py:198-199 - // @abimethod() - // def add_label_to_asset(self, label: String, asset: Asset) -> None: - proto 2 0 - intc_1 // 0 - dup - bytec_2 // "" - dup - // smart_contracts/asset_labeling/contract.py:200 - // ensure(label in self.labels, S("ERR:NOEXIST")) - frame_dig -2 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz add_label_to_asset_after_if_else@19 - // smart_contracts/asset_labeling/contract.py:200 - // ensure(label in self.labels, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -add_label_to_asset_after_if_else@19: - // smart_contracts/asset_labeling/contract.py:202 - // self.operator_only(label) - frame_dig -2 - callsub operator_only - // smart_contracts/asset_labeling/contract.py:204 - // if asset in self.assets: - frame_dig -1 - itob - dup - frame_bury 1 - box_len - bury 1 - bz add_label_to_asset_else_body@2 - // smart_contracts/asset_labeling/contract.py:191 - // if asset not in self.assets: - frame_dig 1 - box_len - bury 1 - bnz add_label_to_asset_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:192 - // return UInt64(NOT_FOUND_KEY) - intc 4 // 4294967296 - -add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12: - // smart_contracts/asset_labeling/contract.py:207 - // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), - intc_3 // 4294967295 - == - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz add_label_to_asset_after_if_else@15 - // smart_contracts/asset_labeling/contract.py:208 - // S("ERR:EXISTS"), - bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -add_label_to_asset_after_if_else@15: - // smart_contracts/asset_labeling/contract.py:211-212 - // # add label to operator - // existing = self.assets[asset].copy() - frame_dig 1 - dup - box_get - assert // check self.assets entry exists - // smart_contracts/asset_labeling/contract.py:213 - // existing.append(arc4.String(label)) - frame_dig -2 - len - itob - extract 6 2 - frame_dig -2 - concat - intc_0 // 1 - callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:214 - // self.assets[asset] = existing.copy() - dig 1 - box_del - pop - box_put - -add_label_to_asset_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:219-220 - // # incr asset count - // label_descriptor = self.labels[label].copy() - frame_dig -2 - box_get - assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:222 - // label_descriptor.num_assets.native + UInt64(1) - dup - intc_2 // 2 - extract_uint64 - intc_0 // 1 - + - // smart_contracts/asset_labeling/contract.py:221-223 - // label_descriptor.num_assets = arc4.UInt64( - // label_descriptor.num_assets.native + UInt64(1) - // ) - itob - replace2 2 - // smart_contracts/asset_labeling/contract.py:224 - // self.labels[label] = label_descriptor.copy() - frame_dig -2 - box_del - pop - frame_dig -2 - swap - box_put - retsub - -add_label_to_asset_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:193 - // for idx, stored_label in uenumerate(self.assets[asset]): - frame_dig 1 - box_get - swap - dup - cover 2 - frame_bury 0 - assert // check self.assets entry exists - intc_1 // 0 - extract_uint16 - frame_bury 2 - intc_1 // 0 - frame_bury 3 - -add_label_to_asset_for_header@7: - // smart_contracts/asset_labeling/contract.py:193 - // for idx, stored_label in uenumerate(self.assets[asset]): - frame_dig 3 - frame_dig 2 - < - bz add_label_to_asset_after_for@11 - frame_dig 0 - extract 2 0 - frame_dig 3 - intc_2 // 2 - * - dig 1 - swap - extract_uint16 - dup2 - extract_uint16 - intc_2 // 2 - + - extract3 - // smart_contracts/asset_labeling/contract.py:194 - // if stored_label == label: - extract 2 0 - frame_dig -2 - == - bz add_label_to_asset_after_if_else@10 - frame_dig 3 - // smart_contracts/asset_labeling/contract.py:207 - // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), - b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 - -add_label_to_asset_after_if_else@10: - frame_dig 3 - intc_0 // 1 - + - frame_bury 3 - b add_label_to_asset_for_header@7 - -add_label_to_asset_after_for@11: - // smart_contracts/asset_labeling/contract.py:196 - // return UInt64(NOT_FOUND_VALUE) - intc_3 // 4294967295 - // smart_contracts/asset_labeling/contract.py:207 - // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), - b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 - -add_label_to_asset_else_body@2: - // smart_contracts/asset_labeling/contract.py:216-217 - // # new operator, create new box - // self.assets[asset] = arc4.DynamicArray(arc4.String(label)) - frame_dig -2 - len - itob - extract 6 2 - frame_dig -2 - concat - bytec 6 // 0x0002 - swap - concat - bytec 11 // 0x0001 - swap - concat - frame_dig 1 - dup - box_del - pop - swap - box_put - b add_label_to_asset_after_if_else@3 - - -// smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset(label: bytes, asset: uint64) -> void: -remove_label_from_asset: - // smart_contracts/asset_labeling/contract.py:226-227 - // @abimethod() - // def remove_label_from_asset(self, label: String, asset: Asset) -> None: - proto 2 0 - intc_1 // 0 - dupn 3 - bytec_2 // "" - dupn 2 - // smart_contracts/asset_labeling/contract.py:228 - // ensure(label in self.labels, S("ERR:NOEXIST")) - frame_dig -2 - box_len - bury 1 - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - bnz remove_label_from_asset_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:228 - // ensure(label in self.labels, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_label_from_asset_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:230 - // self.operator_only(label) - frame_dig -2 - callsub operator_only - // smart_contracts/asset_labeling/contract.py:232 - // found = False - intc_1 // 0 - frame_bury 5 - // smart_contracts/asset_labeling/contract.py:233 - // if self.assets[asset].length == 1: - frame_dig -1 - itob - dup - frame_bury 3 - box_get - assert // check self.assets entry exists - intc_1 // 0 - extract_uint16 - intc_0 // 1 - == - bz remove_label_from_asset_else_body@5 - // smart_contracts/asset_labeling/contract.py:234 - // if self.assets[asset][0] == label: - frame_dig 3 - box_get - assert // check self.assets entry exists - dup - extract 2 0 - swap - intc_1 // 0 - extract_uint16 - assert // Index access is out of bounds - dup - intc_1 // 0 - extract_uint16 - dup2 - extract_uint16 - intc_2 // 2 - + - extract3 - extract 2 0 - frame_dig -2 - == - bz remove_label_from_asset_else_body@3 - // smart_contracts/asset_labeling/contract.py:235 - // del self.assets[asset] - frame_dig 3 - box_del - pop - // smart_contracts/asset_labeling/contract.py:236 - // found = True - intc_0 // 1 - frame_bury 5 - -remove_label_from_asset_after_if_else@13: - // smart_contracts/asset_labeling/contract.py:26 - // if not cond: - frame_dig 5 - bnz remove_label_from_asset_after_if_else@16 - // smart_contracts/asset_labeling/contract.py:251 - // ensure(found, S("ERR:NOEXIST")) - bytec_0 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:27 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:28 - // op.err() - err - -remove_label_from_asset_after_if_else@16: - // smart_contracts/asset_labeling/contract.py:253-254 - // # decr asset count - // label_descriptor = self.labels[label].copy() - frame_dig -2 - box_get - assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:256 - // label_descriptor.num_assets.native - UInt64(1) - dup - intc_2 // 2 - extract_uint64 - intc_0 // 1 - - - // smart_contracts/asset_labeling/contract.py:255-257 - // label_descriptor.num_assets = arc4.UInt64( - // label_descriptor.num_assets.native - UInt64(1) - // ) - itob - replace2 2 - // smart_contracts/asset_labeling/contract.py:258 - // self.labels[label] = label_descriptor.copy() - frame_dig -2 - box_del - pop - frame_dig -2 - swap - box_put - retsub - -remove_label_from_asset_else_body@3: - // smart_contracts/asset_labeling/contract.py:238 - // found = False - intc_1 // 0 - frame_bury 5 - b remove_label_from_asset_after_if_else@13 - -remove_label_from_asset_else_body@5: - // smart_contracts/asset_labeling/contract.py:240 - // next_list = arc4.DynamicArray[arc4.String]() - bytec_3 // 0x0000 - frame_bury 1 - // smart_contracts/asset_labeling/contract.py:241-243 - // # walk, push everything to new box except label - // # save $found to throw if not found - // for idx, stored_label in uenumerate(self.assets[asset]): - frame_dig 3 - box_get - swap - dup - cover 2 - frame_bury 0 - assert // check self.assets entry exists - intc_1 // 0 - extract_uint16 - frame_bury 4 - intc_1 // 0 - frame_bury 6 - -remove_label_from_asset_for_header@6: - // smart_contracts/asset_labeling/contract.py:241-243 - // # walk, push everything to new box except label - // # save $found to throw if not found - // for idx, stored_label in uenumerate(self.assets[asset]): - frame_dig 6 - frame_dig 4 - < - bz remove_label_from_asset_after_for@12 - frame_dig 0 - extract 2 0 - frame_dig 6 - intc_2 // 2 - * - dig 1 - swap - extract_uint16 - dup2 - extract_uint16 - intc_2 // 2 - + - extract3 - dup - frame_bury 2 - // smart_contracts/asset_labeling/contract.py:244 - // if stored_label != label: - extract 2 0 - frame_dig -2 - != - bz remove_label_from_asset_else_body@9 - // smart_contracts/asset_labeling/contract.py:245 - // next_list.append(stored_label) - frame_dig 1 - frame_dig 2 - intc_0 // 1 - callsub dynamic_array_concat_byte_length_head - frame_bury 1 - -remove_label_from_asset_after_if_else@10: - frame_dig 6 - intc_0 // 1 - + - frame_bury 6 - b remove_label_from_asset_for_header@6 - -remove_label_from_asset_else_body@9: - // smart_contracts/asset_labeling/contract.py:247 - // found = True - intc_0 // 1 - frame_bury 5 - b remove_label_from_asset_after_if_else@10 - -remove_label_from_asset_after_for@12: - // smart_contracts/asset_labeling/contract.py:249 - // self.assets[asset] = next_list.copy() - frame_dig 3 - dup - box_del - pop - frame_dig 1 - box_put - b remove_label_from_asset_after_if_else@13 - - -// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels(asset: uint64) -> bytes: -get_asset_labels: - // smart_contracts/asset_labeling/contract.py:260-261 - // @abimethod(readonly=True) - // def get_asset_labels(self, asset: Asset) -> LabelList: - proto 1 1 - // smart_contracts/asset_labeling/contract.py:262 - // if asset in self.assets: - frame_dig -1 - itob - dup - box_len - bury 1 - bz get_asset_labels_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:263 - // return self.assets[asset] - frame_dig 0 - box_get - assert // check self.assets entry exists - swap - retsub - -get_asset_labels_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:33 - // return arc4.DynamicArray[arc4.String]() - bytec_3 // 0x0000 - // smart_contracts/asset_labeling/contract.py:264-265 - // # return empty - // return empty_list() - swap - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels(assets: bytes) -> bytes: -get_assets_labels: - // smart_contracts/asset_labeling/contract.py:267-270 - // @abimethod(readonly=True) - // def get_assets_labels( - // self, assets: arc4.DynamicArray[arc4.UInt64] - // ) -> arc4.DynamicArray[LabelList]: - proto 1 1 - intc_1 // 0 - // smart_contracts/asset_labeling/contract.py:271 - // out = arc4.DynamicArray[LabelList]() - bytec_3 // 0x0000 - // smart_contracts/asset_labeling/contract.py:272 - // for _i, asset_id in uenumerate(assets): - frame_dig -1 - intc_1 // 0 - extract_uint16 - intc_1 // 0 - -get_assets_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:272 - // for _i, asset_id in uenumerate(assets): - frame_dig 3 - frame_dig 2 - < - bz get_assets_labels_after_for@7 - frame_dig -1 - extract 2 0 - frame_dig 3 - pushint 8 // 8 - * - // smart_contracts/asset_labeling/contract.py:273 - // asset = Asset(asset_id.native) - extract_uint64 - // smart_contracts/asset_labeling/contract.py:274 - // if asset in self.assets: - itob - dup - frame_bury 0 - box_len - bury 1 - bz get_assets_labels_else_body@4 - // smart_contracts/asset_labeling/contract.py:275 - // out.append(self.assets[asset].copy()) - frame_dig 0 - box_get - assert // check self.assets entry exists - bytec 6 // 0x0002 - swap - concat - frame_dig 1 - dup - intc_1 // 0 - extract_uint16 - swap - extract 2 0 - intc_0 // 1 - uncover 3 - callsub dynamic_array_concat_dynamic_element - frame_bury 1 - -get_assets_labels_after_if_else@5: - frame_dig 3 - intc_0 // 1 - + - frame_bury 3 - b get_assets_labels_for_header@1 - -get_assets_labels_else_body@4: - // smart_contracts/asset_labeling/contract.py:277 - // out.append(empty_list()) - frame_dig 1 - dup - intc_1 // 0 - extract_uint16 - swap - extract 2 0 - intc_0 // 1 - pushbytes 0x00020000 - callsub dynamic_array_concat_dynamic_element - frame_bury 1 - b get_assets_labels_after_if_else@5 - -get_assets_labels_after_for@7: - // smart_contracts/asset_labeling/contract.py:278 - // return out - frame_dig 1 - frame_bury 0 - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro(asset_id: uint64) -> bytes: -_get_asset_micro: - // smart_contracts/asset_labeling/contract.py:280-282 - // # Batch asset data fetch methods - // @subroutine - // def _get_asset_micro(self, asset_id: UInt64) -> AssetMicro: - proto 1 1 - // smart_contracts/asset_labeling/contract.py:285 - // unit_name=b2str(asset.unit_name), - frame_dig -1 - asset_params_get AssetUnitName - assert // asset exists - // smart_contracts/asset_labeling/contract.py:38 - // return arc4.String(String.from_bytes(b)) - dup - len - itob - extract 6 2 - swap - concat - // smart_contracts/asset_labeling/contract.py:286 - // decimals=arc4.UInt8(asset.decimals), - frame_dig -1 - asset_params_get AssetDecimals - assert // asset exists - itob - dup - bitlen - pushint 8 // 8 - <= - assert // overflow - extract 7 1 - // smart_contracts/asset_labeling/contract.py:284-287 - // return AssetMicro( - // unit_name=b2str(asset.unit_name), - // decimals=arc4.UInt8(asset.decimals), - // ) - pushbytes 0x0003 - swap - concat - swap - concat - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro(asset: uint64) -> bytes: -get_asset_micro: - // smart_contracts/asset_labeling/contract.py:289-290 - // @abimethod(readonly=True) - // def get_asset_micro(self, asset: UInt64) -> AssetMicro: - proto 1 1 - // smart_contracts/asset_labeling/contract.py:291 - // return self._get_asset_micro(asset) - frame_dig -1 - callsub _get_asset_micro - retsub - - -// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro(assets: bytes) -> void: -get_assets_micro: - // smart_contracts/asset_labeling/contract.py:293-294 - // @abimethod(readonly=True) - // def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: - proto 1 0 - // smart_contracts/asset_labeling/contract.py:295 - // for _i, asset_id in uenumerate(assets): - frame_dig -1 - intc_1 // 0 - extract_uint16 - intc_1 // 0 - -get_assets_micro_for_header@1: - // smart_contracts/asset_labeling/contract.py:295 - // for _i, asset_id in uenumerate(assets): - frame_dig 1 - frame_dig 0 - < - bz get_assets_micro_after_for@4 - frame_dig -1 - extract 2 0 - frame_dig 1 - dup - cover 2 - pushint 8 // 8 - * - // smart_contracts/asset_labeling/contract.py:296 - // log(self._get_asset_micro(asset_id.native)) - extract_uint64 - callsub _get_asset_micro - log - intc_0 // 1 - + - frame_bury 1 - b get_assets_micro_for_header@1 - -get_assets_micro_after_for@4: - retsub diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json deleted file mode 100644 index a95c864..0000000 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json +++ /dev/null @@ -1,538 +0,0 @@ -{ - "name": "AssetLabeling", - "structs": { - "AssetMicro": [ - { - "name": "unit_name", - "type": "string" - }, - { - "name": "decimals", - "type": "uint8" - } - ], - "LabelDescriptor": [ - { - "name": "name", - "type": "string" - }, - { - "name": "num_assets", - "type": "uint64" - }, - { - "name": "num_operators", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "change_admin", - "args": [ - { - "type": "account", - "name": "new_admin" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "events": [], - "recommendations": {} - }, - { - "name": "add_label", - "args": [ - { - "type": "string", - "name": "id" - }, - { - "type": "string", - "name": "name" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "events": [], - "recommendations": {} - }, - { - "name": "remove_label", - "args": [ - { - "type": "string", - "name": "id" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "events": [], - "recommendations": {} - }, - { - "name": "get_label", - "args": [ - { - "type": "string", - "name": "id" - } - ], - "returns": { - "type": "(string,uint64,uint64)", - "struct": "LabelDescriptor" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "events": [], - "recommendations": {} - }, - { - "name": "log_labels", - "args": [ - { - "type": "string[]", - "name": "ids" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "events": [], - "recommendations": {} - }, - { - "name": "add_operator_to_label", - "args": [ - { - "type": "account", - "name": "operator" - }, - { - "type": "string", - "name": "label" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "events": [], - "recommendations": {} - }, - { - "name": "remove_operator_from_label", - "args": [ - { - "type": "account", - "name": "operator" - }, - { - "type": "string", - "name": "label" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "events": [], - "recommendations": {} - }, - { - "name": "get_operator_labels", - "args": [ - { - "type": "account", - "name": "operator" - } - ], - "returns": { - "type": "string[]" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "events": [], - "recommendations": {} - }, - { - "name": "add_label_to_asset", - "args": [ - { - "type": "string", - "name": "label" - }, - { - "type": "asset", - "name": "asset" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "events": [], - "recommendations": {} - }, - { - "name": "remove_label_from_asset", - "args": [ - { - "type": "string", - "name": "label" - }, - { - "type": "asset", - "name": "asset" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_labels", - "args": [ - { - "type": "asset", - "name": "asset" - } - ], - "returns": { - "type": "string[]" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "events": [], - "recommendations": {} - }, - { - "name": "get_assets_labels", - "args": [ - { - "type": "uint64[]", - "name": "assets" - } - ], - "returns": { - "type": "string[][]" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_micro", - "args": [ - { - "type": "uint64", - "name": "asset" - } - ], - "returns": { - "type": "(string,uint8)", - "struct": "AssetMicro" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "events": [], - "recommendations": {} - }, - { - "name": "get_assets_micro", - "args": [ - { - "type": "uint64[]", - "name": "assets" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 0, - "bytes": 1 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "admin": { - "keyType": "AVMString", - "valueType": "AVMBytes", - "key": "YWRtaW4=" - } - }, - "local": {}, - "box": {} - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "labels": { - "keyType": "AVMString", - "valueType": "LabelDescriptor", - "prefix": "" - }, - "assets": { - "keyType": "AVMUint64", - "valueType": "string[]", - "prefix": "" - }, - "operators": { - "keyType": "AVMBytes", - "valueType": "string[]", - "prefix": "" - } - } - } - }, - "bareActions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 896, - 1331, - 1350, - 1773 - ], - "errorMessage": "Index access is out of bounds" - }, - { - "pc": [ - 230, - 245, - 265, - 284, - 306, - 330, - 354, - 376, - 400, - 424, - 439, - 461, - 479, - 503 - ], - "errorMessage": "OnCompletion is not NoOp" - }, - { - "pc": [ - 2058, - 2071 - ], - "errorMessage": "asset exists" - }, - { - "pc": [ - 526 - ], - "errorMessage": "can only call when creating" - }, - { - "pc": [ - 233, - 248, - 268, - 287, - 309, - 333, - 357, - 379, - 403, - 427, - 442, - 464, - 482, - 506 - ], - "errorMessage": "can only call when not creating" - }, - { - "pc": [ - 770, - 993 - ], - "errorMessage": "check self.admin exists" - }, - { - "pc": [ - 1580, - 1630, - 1754, - 1765, - 1845, - 1943, - 1991 - ], - "errorMessage": "check self.assets entry exists" - }, - { - "pc": [ - 895, - 931, - 974, - 1207, - 1330, - 1603, - 1809 - ], - "errorMessage": "check self.labels entry exists" - }, - { - "pc": [ - 1074, - 1181, - 1389, - 1414, - 1518 - ], - "errorMessage": "check self.operators entry exists" - }, - { - "pc": [ - 2078 - ], - "errorMessage": "overflow" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" - }, - "byteCode": { - "approval": "CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBBUffHUAAgAABWFkbWluCkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAUnBDEAZzEbQQGOgg4Ejw19jgR8GzL2BBfmka4EM9D/3ARyVhbnBPrBzxsEtMULnwSi3SJHBKN96hEEaPGO+gTC7XQ/BKZ/A8IEqu4MYQS2w59oNhoAjg4BEwD7AOkA0wDEAKwAlAB+AGYATgA4ACUAEQACI0MxGRREMRhENhoBiAdEIkMxGRREMRhENhoBF4gHKylMULAiQzEZFEQxGEQ2GgGIBoopTFCwIkMxGRREMRhENhoBF8AwiAZeKUxQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFciJDMRkURDEYRDYaAVcCADYaAhfAMIgElSJDMRkURDEYRDYaARfAHIgEcSlMULAiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIA1wiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIAswiQzEZFEQxGEQ2GgGIAfMiQzEZFEQxGEQ2GgFXAgCIAc4pTFCwIkMxGRREMRhENhoBVwIAiAGFIkMxGRREMRhENhoBVwIANhoCVwIAiAEmIkMxGRREMRhENhoBF8AciAEIIkMxGUD+1jEYFEQiQ4oDAYv9I1lJi/8ITCQLJAhLARZXBgJOAov9JEsCUov/JAuvUIv9FYv9TwNPAlJQi/5QTCQLSSNMiwOLAgxBACOLBEkWVwYCiwGLA0lOBE8CXUmMAUsBWSQICIwEJAiMA0L/1YsAiwFQjACJigQBKkmL/iQLi/wkCyOLBIsDDEEAHIv9iwRJTgJZiwIIFlcGAosBTFCMASQIjARC/9yL/RWMACOMBIsEiwIMQQAci/+LBElOAlmLAAgWVwYCiwFMUIwBJAiMBEL/3Iv8i/4IFlcGAosBUIv9iwOLAFJQi/8Vi/+LAk8CUlCMAIkxACMnBGVEEkAABCcHsACJigEAiP/qJwSL/2eJigIAiP/ei/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5eL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjJwRlRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnB7AAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9hi/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcFsACL/r5Ei/8VFlcGAov/UCKI/WWL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwZMUCcLTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ji/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAwosHIQQTQQC6IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJwmoQQCJIkAABCcKsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiSuMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj8UowDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv90I0L/Q4oBAYv/vUUBQQAFi/++RIkriYoCACNJKkmL/r1FAUAAAyiwAIv+iP3ki/8WSYwBvUUBQQCGiwG9RQFAADghBCUSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+9ZLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kYsDIgiMA0L/zyVC/4SL/hUWVwYCi/5QJwZMUCcLTFCLAUm8SEy/Qv+JigIAI0cDKkcCi/69RQFAAAMosACL/oj9HSOMBYv/FkmMA75EI1kiEkEAR4sDvkRJVwIATCNZREkjWUpZJAhYVwIAi/4SQQAkiwO8SCKMBYsFQAADKLAAi/6+REkkWyIJFlwCi/68SIv+TL+JI4wFQv/dK4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPqmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/f4oBAYv/Fkm9RQFBAAaLAL5ETIkrTImKAQEjK4v/I1kjiwOLAgxBAE+L/1cCAIsDgQgLWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6oYwBiwMiCIwDQv/BiwFJI1lMVwIAIoAEAAIAAIj6g4wBQv/fiwGMAImKAQGL/3EDREkVFlcGAkxQi/9xAUQWSZOBCA5EVwcBgAIAA0xQTFCJigEBi/+I/9CJigEAi/8jWSOLAYsADEEAGYv/VwIAiwFJTgKBCAtbiP+usCIIjAFC/9+J", - "clear": "CoEBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 4, - "minor": 6, - "patch": 1 - } - }, - "events": [], - "templateVariables": {} -} \ No newline at end of file diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map deleted file mode 100644 index 7e7f2c0..0000000 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal deleted file mode 100644 index a433105..0000000 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 10 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 // 1 - return diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts deleted file mode 100644 index ada57f4..0000000 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts +++ /dev/null @@ -1,1770 +0,0 @@ -/* eslint-disable */ -/** - * This file was automatically generated by @algorandfoundation/algokit-client-generator. - * DO NOT MODIFY IT BY HAND. - * requires: @algorandfoundation/algokit-utils: ^7 - */ -import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' -import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' -import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' -import { - AppClient as _AppClient, - AppClientMethodCallParams, - AppClientParams, - AppClientBareCallParams, - CallOnComplete, - AppClientCompilationParams, - ResolveAppClientByCreatorAndName, - ResolveAppClientByNetwork, - CloneAppClientParams, -} from '@algorandfoundation/algokit-utils/types/app-client' -import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' -import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' -import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' -import SimulateResponse = modelsv2.SimulateResponse - -export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[896,1331,1350,1773],"errorMessage":"Index access is out of bounds"},{"pc":[230,245,265,284,306,330,354,376,400,424,439,461,479,503],"errorMessage":"OnCompletion is not NoOp"},{"pc":[2058,2071],"errorMessage":"asset exists"},{"pc":[526],"errorMessage":"can only call when creating"},{"pc":[233,248,268,287,309,333,357,379,403,427,442,464,482,506],"errorMessage":"can only call when not creating"},{"pc":[770,993],"errorMessage":"check self.admin exists"},{"pc":[1580,1630,1754,1765,1845,1943,1991],"errorMessage":"check self.assets entry exists"},{"pc":[895,931,974,1207,1330,1603,1809],"errorMessage":"check self.labels entry exists"},{"pc":[1074,1181,1389,1414,1518],"errorMessage":"check self.operators entry exists"},{"pc":[2078],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1ICIiIDB4MDAwMCAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMTkKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNybwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbF90b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9nX2xhYmVsc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGxvZ19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2xhYmVsX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9sYWJlbAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBjaGFuZ2VfYWRtaW4KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQ6CiAgICBwcm90byAzIDEKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBiemVybwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDIKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDU6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18xIC8vIDAKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDg6CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTMtNTQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgtNTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjczCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODItODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkbWluX29yX29wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcub3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6Cm9wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTktMTAwCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IG9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAxCiAgICAvLyBTKCJFUlI6VU5BVVRIIiksCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm9wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgcmV0c3ViCgpvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIG9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDQtMTA1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBpZiBvcGVyYXRvciBub3QgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTAKICAgIC8vIHJldHVybiBpZHgKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDMKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX29wZXJhdG9yX3RvX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZGRfb3BlcmF0b3JfdG9fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX29wZXJhdG9yX3RvX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vICMgY2hlY2sgaWYgb3BlcmF0b3IgZXhpc3RzIGFscmVhZHkKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBhZGQgbGFiZWwgdG8gb3BlcmF0b3IKICAgIC8vIGV4aXN0aW5nID0gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI4CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gZXhpc3RpbmcuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vICMgaW5jcmVtZW50IGxhYmVsIG9wZXJhdG9ycwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKG9wZXJhdG9yOiBieXRlcywgbGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQzCiAgICAvLyBzZWxmLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDYKICAgIC8vIGVuc3VyZShvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9ycywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBlbnN1cmUgbGFiZWwgZXhpc3RzIGluIG9wZXJhdG9yCiAgICAvLyBsYWJlbF9pZHggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxCiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUzCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTMKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIFMoIkVSUjpOT0VYSVNUIiksCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vICMgZW5zdXJlIG9ubHkgZW1wdHkgbGFiZWxzIGNhbiBiZSBsZWZ0IG9wZXJhdG9yLWxlc3MKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPiAxIG9yIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9PSAwLAogICAgZXh0cmFjdCAxMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj4KICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUA3CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX3RydWVANjoKICAgIGludGNfMCAvLyAxCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIFMoIkVSUjpOT0VNUFRZIiksCiAgICBieXRlYyAxMCAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjUKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjcKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzIKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3My0xNzYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzcKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzgKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODItMTgzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg2LTE4NwogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTEKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTEtMjEyCiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEzCiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxOS0yMjAKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxLTIyMwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGNfMyAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYtMjE3CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzUKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTUtMjU3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU4CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzgKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDEtMjQzCiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjAtMjYxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY1CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2Ny0yNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18zIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzIKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc0CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc1CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc4CiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MC0yODIKICAgIC8vICMgQmF0Y2ggYXNzZXQgZGF0YSBmZXRjaCBtZXRob2RzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHJldHVybiBBc3NldE1pY3JvKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNybyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4OS0yOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm8oc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNybzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm8oc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNybyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAFAQAC/////w+AgICAECYMC0VSUjpOT0VYSVNUBBUffHUAAgAABWFkbWluCkVSUjpFWElTVFMCAAIKRVJSOlVOQVVUSApFUlI6TEVOR1RICAAAAAAAAAAAC0VSUjpOT0VNUFRZAgABMRhAAAUnBDEAZzEbQQGOgg4Ejw19jgR8GzL2BBfmka4EM9D/3ARyVhbnBPrBzxsEtMULnwSi3SJHBKN96hEEaPGO+gTC7XQ/BKZ/A8IEqu4MYQS2w59oNhoAjg4BEwD7AOkA0wDEAKwAlAB+AGYATgA4ACUAEQACI0MxGRREMRhENhoBiAdEIkMxGRREMRhENhoBF4gHKylMULAiQzEZFEQxGEQ2GgGIBoopTFCwIkMxGRREMRhENhoBF8AwiAZeKUxQsCJDMRkURDEYRDYaAVcCADYaAhfAMIgFciJDMRkURDEYRDYaAVcCADYaAhfAMIgElSJDMRkURDEYRDYaARfAHIgEcSlMULAiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIA1wiQzEZFEQxGEQ2GgEXwBw2GgJXAgCIAswiQzEZFEQxGEQ2GgGIAfMiQzEZFEQxGEQ2GgFXAgCIAc4pTFCwIkMxGRREMRhENhoBVwIAiAGFIkMxGRREMRhENhoBVwIANhoCVwIAiAEmIkMxGRREMRhENhoBF8AciAEIIkMxGUD+1jEYFEQiQ4oDAYv9I1lJi/8ITCQLJAhLARZXBgJOAov9JEsCUov/JAuvUIv9FYv9TwNPAlJQi/5QTCQLSSNMiwOLAgxBACOLBEkWVwYCiwGLA0lOBE8CXUmMAUsBWSQICIwEJAiMA0L/1YsAiwFQjACJigQBKkmL/iQLi/wkCyOLBIsDDEEAHIv9iwRJTgJZiwIIFlcGAosBTFCMASQIjARC/9yL/RWMACOMBIsEiwIMQQAci/+LBElOAlmLAAgWVwYCiwFMUIwBJAiMBEL/3Iv8i/4IFlcGAosBUIv9iwOLAFJQi/8Vi/+LAk8CUlCMAIkxACMnBGVEEkAABCcHsACJigEAiP/qJwSL/2eJigIAiP/ei/69RQFBAAQnBbAAi/4VJBJAAAQnCLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/5eL/71FAUAAAyiwAIv/FSQSQAAEJwiwAIv/vkRXAggnCahAAAQnCrAAi/+8SImKAQGL/71FAUAAAyiwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjJwRlRBJBAAGJi/+IAAGJigEAMQCL/4gAHyEEE0EAFTEAi/+IABIlE0EACSJAAAQnB7AAiSNC//SKAgEjKkmL/r1FAUAABSEEjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PJYwAiYoCAIv/iP9hi/+9RQFAAAMosACL/r1FAUEAQIv+i/+I/4UlEkAABCcFsACL/r5Ei/8VFlcGAov/UCKI/WWL/rxIi/5Mv4v/vkRJgQpbIggWXAqL/7xIi/9Mv4mL/xUWVwYCi/9QJwZMUCcLTFCL/rxIi/5Mv0L/zYoCACNHBCpHAov/iP7ji/+9RQFAAAMosACL/r1FAUAAAyiwAIv+i/+I/wRJjAclE0EAwosHIQQTQQC6IkAAAyiwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJwmoQQCJIkAABCcKsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiSuMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj8UowDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv90I0L/Q4oBAYv/vUUBQQAFi/++RIkriYoCACNJKkmL/r1FAUAAAyiwAIv+iP3ki/8WSYwBvUUBQQCGiwG9RQFAADghBCUSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+9ZLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kYsDIgiMA0L/zyVC/4SL/hUWVwYCi/5QJwZMUCcLTFCLAUm8SEy/Qv+JigIAI0cDKkcCi/69RQFAAAMosACL/oj9HSOMBYv/FkmMA75EI1kiEkEAR4sDvkRJVwIATCNZREkjWUpZJAhYVwIAi/4SQQAkiwO8SCKMBYsFQAADKLAAi/6+REkkWyIJFlwCi/68SIv+TL+JI4wFQv/dK4wBiwO+TElOAowARCNZjAQjjAaLBosEDEEAN4sAVwIAiwYkC0sBTFlKWSQIWEmMAlcCAIv+E0EAE4sBiwIiiPqmjAGLBiIIjAZC/8cijAVC//GLA0m8SIsBv0L/f4oBAYv/Fkm9RQFBAAaLAL5ETIkrTImKAQEjK4v/I1kjiwOLAgxBAE+L/1cCAIsDgQgLWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6oYwBiwMiCIwDQv/BiwFJI1lMVwIAIoAEAAIAAIj6g4wBQv/fiwGMAImKAQGL/3EDREkVFlcGAkxQi/9xAUQWSZOBCA5EVwcBgAIAA0xQTFCJigEBi/+I/9CJigEAi/8jWSOLAYsADEEAGYv/VwIAiwFJTgKBCAtbiP+usCIIjAFC/9+J","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract - -/** - * A state record containing binary data - */ -export interface BinaryState { - /** - * Gets the state value as a Uint8Array - */ - asByteArray(): Uint8Array | undefined - /** - * Gets the state value as a string - */ - asString(): string | undefined -} - -class BinaryStateValue implements BinaryState { - constructor(private value: Uint8Array | undefined) {} - - asByteArray(): Uint8Array | undefined { - return this.value - } - - asString(): string | undefined { - return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined - } -} - -/** - * Expands types for IntelliSense so they are more human readable - * See https://stackoverflow.com/a/69288824 - */ -export type Expand = T extends (...args: infer A) => infer R - ? (...args: Expand) => Expand - : T extends infer O - ? { [K in keyof O]: O[K] } - : never - - -// Type definitions for ARC-56 structs - -export type AssetMicro = { - unitName: string, - decimals: number -} - - -/** - * Converts the ABI tuple representation of a AssetMicro to the struct representation - */ -export function AssetMicroFromTuple(abiTuple: [string, number]) { - return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicro, APP_SPEC.structs) as AssetMicro -} - -export type LabelDescriptor = { - name: string, - numAssets: bigint, - numOperators: bigint -} - - -/** - * Converts the ABI tuple representation of a LabelDescriptor to the struct representation - */ -export function LabelDescriptorFromTuple(abiTuple: [string, bigint, bigint]) { - return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.LabelDescriptor, APP_SPEC.structs) as LabelDescriptor -} - -/** - * The argument types for the AssetLabeling contract - */ -export type AssetLabelingArgs = { - /** - * The object representation of the arguments for each method - */ - obj: { - 'change_admin(account)void': { - newAdmin: Uint8Array | string - } - 'add_label(string,string)void': { - id: string - name: string - } - 'remove_label(string)void': { - id: string - } - 'get_label(string)(string,uint64,uint64)': { - id: string - } - 'log_labels(string[])void': { - ids: string[] - } - 'add_operator_to_label(account,string)void': { - operator: Uint8Array | string - label: string - } - 'remove_operator_from_label(account,string)void': { - operator: Uint8Array | string - label: string - } - 'get_operator_labels(account)string[]': { - operator: Uint8Array | string - } - 'add_label_to_asset(string,asset)void': { - label: string - asset: bigint - } - 'remove_label_from_asset(string,asset)void': { - label: string - asset: bigint - } - 'get_asset_labels(asset)string[]': { - asset: bigint - } - 'get_assets_labels(uint64[])string[][]': { - assets: bigint[] | number[] - } - 'get_asset_micro(uint64)(string,uint8)': { - asset: bigint | number - } - 'get_assets_micro(uint64[])void': { - assets: bigint[] | number[] - } - } - /** - * The tuple representation of the arguments for each method - */ - tuple: { - 'change_admin(account)void': [newAdmin: Uint8Array | string] - 'add_label(string,string)void': [id: string, name: string] - 'remove_label(string)void': [id: string] - 'get_label(string)(string,uint64,uint64)': [id: string] - 'log_labels(string[])void': [ids: string[]] - 'add_operator_to_label(account,string)void': [operator: Uint8Array | string, label: string] - 'remove_operator_from_label(account,string)void': [operator: Uint8Array | string, label: string] - 'get_operator_labels(account)string[]': [operator: Uint8Array | string] - 'add_label_to_asset(string,asset)void': [label: string, asset: bigint] - 'remove_label_from_asset(string,asset)void': [label: string, asset: bigint] - 'get_asset_labels(asset)string[]': [asset: bigint] - 'get_assets_labels(uint64[])string[][]': [assets: bigint[] | number[]] - 'get_asset_micro(uint64)(string,uint8)': [asset: bigint | number] - 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] - } -} - -/** - * The return type for each method - */ -export type AssetLabelingReturns = { - 'change_admin(account)void': void - 'add_label(string,string)void': void - 'remove_label(string)void': void - 'get_label(string)(string,uint64,uint64)': LabelDescriptor - 'log_labels(string[])void': void - 'add_operator_to_label(account,string)void': void - 'remove_operator_from_label(account,string)void': void - 'get_operator_labels(account)string[]': string[] - 'add_label_to_asset(string,asset)void': void - 'remove_label_from_asset(string,asset)void': void - 'get_asset_labels(asset)string[]': string[] - 'get_assets_labels(uint64[])string[][]': string[][] - 'get_asset_micro(uint64)(string,uint8)': AssetMicro - 'get_assets_micro(uint64[])void': void -} - -/** - * Defines the types of available calls and state of the AssetLabeling smart contract. - */ -export type AssetLabelingTypes = { - /** - * Maps method signatures / names to their argument and return types. - */ - methods: - & Record<'change_admin(account)void' | 'change_admin', { - argsObj: AssetLabelingArgs['obj']['change_admin(account)void'] - argsTuple: AssetLabelingArgs['tuple']['change_admin(account)void'] - returns: AssetLabelingReturns['change_admin(account)void'] - }> - & Record<'add_label(string,string)void' | 'add_label', { - argsObj: AssetLabelingArgs['obj']['add_label(string,string)void'] - argsTuple: AssetLabelingArgs['tuple']['add_label(string,string)void'] - returns: AssetLabelingReturns['add_label(string,string)void'] - }> - & Record<'remove_label(string)void' | 'remove_label', { - argsObj: AssetLabelingArgs['obj']['remove_label(string)void'] - argsTuple: AssetLabelingArgs['tuple']['remove_label(string)void'] - returns: AssetLabelingReturns['remove_label(string)void'] - }> - & Record<'get_label(string)(string,uint64,uint64)' | 'get_label', { - argsObj: AssetLabelingArgs['obj']['get_label(string)(string,uint64,uint64)'] - argsTuple: AssetLabelingArgs['tuple']['get_label(string)(string,uint64,uint64)'] - returns: AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] - }> - & Record<'log_labels(string[])void' | 'log_labels', { - argsObj: AssetLabelingArgs['obj']['log_labels(string[])void'] - argsTuple: AssetLabelingArgs['tuple']['log_labels(string[])void'] - returns: AssetLabelingReturns['log_labels(string[])void'] - }> - & Record<'add_operator_to_label(account,string)void' | 'add_operator_to_label', { - argsObj: AssetLabelingArgs['obj']['add_operator_to_label(account,string)void'] - argsTuple: AssetLabelingArgs['tuple']['add_operator_to_label(account,string)void'] - returns: AssetLabelingReturns['add_operator_to_label(account,string)void'] - }> - & Record<'remove_operator_from_label(account,string)void' | 'remove_operator_from_label', { - argsObj: AssetLabelingArgs['obj']['remove_operator_from_label(account,string)void'] - argsTuple: AssetLabelingArgs['tuple']['remove_operator_from_label(account,string)void'] - returns: AssetLabelingReturns['remove_operator_from_label(account,string)void'] - }> - & Record<'get_operator_labels(account)string[]' | 'get_operator_labels', { - argsObj: AssetLabelingArgs['obj']['get_operator_labels(account)string[]'] - argsTuple: AssetLabelingArgs['tuple']['get_operator_labels(account)string[]'] - returns: AssetLabelingReturns['get_operator_labels(account)string[]'] - }> - & Record<'add_label_to_asset(string,asset)void' | 'add_label_to_asset', { - argsObj: AssetLabelingArgs['obj']['add_label_to_asset(string,asset)void'] - argsTuple: AssetLabelingArgs['tuple']['add_label_to_asset(string,asset)void'] - returns: AssetLabelingReturns['add_label_to_asset(string,asset)void'] - }> - & Record<'remove_label_from_asset(string,asset)void' | 'remove_label_from_asset', { - argsObj: AssetLabelingArgs['obj']['remove_label_from_asset(string,asset)void'] - argsTuple: AssetLabelingArgs['tuple']['remove_label_from_asset(string,asset)void'] - returns: AssetLabelingReturns['remove_label_from_asset(string,asset)void'] - }> - & Record<'get_asset_labels(asset)string[]' | 'get_asset_labels', { - argsObj: AssetLabelingArgs['obj']['get_asset_labels(asset)string[]'] - argsTuple: AssetLabelingArgs['tuple']['get_asset_labels(asset)string[]'] - returns: AssetLabelingReturns['get_asset_labels(asset)string[]'] - }> - & Record<'get_assets_labels(uint64[])string[][]' | 'get_assets_labels', { - argsObj: AssetLabelingArgs['obj']['get_assets_labels(uint64[])string[][]'] - argsTuple: AssetLabelingArgs['tuple']['get_assets_labels(uint64[])string[][]'] - returns: AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] - }> - & Record<'get_asset_micro(uint64)(string,uint8)' | 'get_asset_micro', { - argsObj: AssetLabelingArgs['obj']['get_asset_micro(uint64)(string,uint8)'] - argsTuple: AssetLabelingArgs['tuple']['get_asset_micro(uint64)(string,uint8)'] - returns: AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] - }> - & Record<'get_assets_micro(uint64[])void' | 'get_assets_micro', { - argsObj: AssetLabelingArgs['obj']['get_assets_micro(uint64[])void'] - argsTuple: AssetLabelingArgs['tuple']['get_assets_micro(uint64[])void'] - returns: AssetLabelingReturns['get_assets_micro(uint64[])void'] - }> - /** - * Defines the shape of the state of the application. - */ - state: { - global: { - keys: { - admin: BinaryState - } - maps: {} - } - box: { - keys: {} - maps: { - labels: Map - assets: Map - operators: Map - } - } - } -} - -/** - * Defines the possible abi call signatures. - */ -export type AssetLabelingSignatures = keyof AssetLabelingTypes['methods'] -/** - * Defines the possible abi call signatures for methods that return a non-void value. - */ -export type AssetLabelingNonVoidMethodSignatures = keyof AssetLabelingTypes['methods'] extends infer T ? T extends keyof AssetLabelingTypes['methods'] ? MethodReturn extends void ? never : T : never : never -/** - * Defines an object containing all relevant parameters for a single call to the contract. - */ -export type CallParams = Expand< - Omit & - { - /** The args for the ABI method call, either as an ordered array or an object */ - args: Expand - } -> -/** - * Maps a method signature from the AssetLabeling smart contract to the method's arguments in either tuple or struct form - */ -export type MethodArgs = AssetLabelingTypes['methods'][TSignature]['argsObj' | 'argsTuple'] -/** - * Maps a method signature from the AssetLabeling smart contract to the method's return type - */ -export type MethodReturn = AssetLabelingTypes['methods'][TSignature]['returns'] - -/** - * Defines the shape of the keyed global state of the application. - */ -export type GlobalKeysState = AssetLabelingTypes['state']['global']['keys'] - -/** - * Defines the shape of the keyed box state of the application. - */ -export type BoxKeysState = AssetLabelingTypes['state']['box']['keys'] - - -/** - * Defines supported create method params for this smart contract - */ -export type AssetLabelingCreateCallParams = - | Expand -/** - * Defines arguments required for the deploy method. - */ -export type AssetLabelingDeployParams = Expand & { - /** - * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) - */ - createParams?: AssetLabelingCreateCallParams -}> - - -/** - * Exposes methods for constructing `AppClient` params objects for ABI calls to the AssetLabeling smart contract - */ -export abstract class AssetLabelingParamsFactory { - /** - * Constructs a no op call for the change_admin(account)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static changeAdmin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'change_admin(account)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.newAdmin], - } - } - /** - * Constructs a no op call for the add_label(string,string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static addLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'add_label(string,string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.name], - } - } - /** - * Constructs a no op call for the remove_label(string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static removeLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'remove_label(string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.id], - } - } - /** - * Constructs a no op call for the get_label(string)(string,uint64,uint64) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_label(string)(string,uint64,uint64)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.id], - } - } - /** - * Constructs a no op call for the log_labels(string[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static logLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'log_labels(string[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.ids], - } - } - /** - * Constructs a no op call for the add_operator_to_label(account,string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static addOperatorToLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'add_operator_to_label(account,string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.operator, params.args.label], - } - } - /** - * Constructs a no op call for the remove_operator_from_label(account,string)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static removeOperatorFromLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'remove_operator_from_label(account,string)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.operator, params.args.label], - } - } - /** - * Constructs a no op call for the get_operator_labels(account)string[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getOperatorLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_operator_labels(account)string[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.operator], - } - } - /** - * Constructs a no op call for the add_label_to_asset(string,asset)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static addLabelToAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'add_label_to_asset(string,asset)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.label, params.args.asset], - } - } - /** - * Constructs a no op call for the remove_label_from_asset(string,asset)void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static removeLabelFromAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'remove_label_from_asset(string,asset)void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.label, params.args.asset], - } - } - /** - * Constructs a no op call for the get_asset_labels(asset)string[] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getAssetLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_asset_labels(asset)string[]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset], - } - } - /** - * Constructs a no op call for the get_assets_labels(uint64[])string[][] ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getAssetsLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_assets_labels(uint64[])string[][]' as const, - args: Array.isArray(params.args) ? params.args : [params.args.assets], - } - } - /** - * Constructs a no op call for the get_asset_micro(uint64)(string,uint8) ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getAssetMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_asset_micro(uint64)(string,uint8)' as const, - args: Array.isArray(params.args) ? params.args : [params.args.asset], - } - } - /** - * Constructs a no op call for the get_assets_micro(uint64[])void ABI method - * - * @param params Parameters for the call - * @returns An `AppClientMethodCallParams` object for the call - */ - static getAssetsMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { - return { - ...params, - method: 'get_assets_micro(uint64[])void' as const, - args: Array.isArray(params.args) ? params.args : [params.args.assets], - } - } -} - -/** - * A factory to create and deploy one or more instance of the AssetLabeling smart contract and to create one or more app clients to interact with those (or other) app instances - */ -export class AssetLabelingFactory { - /** - * The underlying `AppFactory` for when you want to have more flexibility - */ - public readonly appFactory: _AppFactory - - /** - * Creates a new instance of `AssetLabelingFactory` - * - * @param params The parameters to initialise the app factory with - */ - constructor(params: Omit) { - this.appFactory = new _AppFactory({ - ...params, - appSpec: APP_SPEC, - }) - } - - /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ - public get appName() { - return this.appFactory.appName - } - - /** The ARC-56 app spec being used */ - get appSpec() { - return APP_SPEC - } - - /** A reference to the underlying `AlgorandClient` this app factory is using. */ - public get algorand(): AlgorandClient { - return this.appFactory.algorand - } - - /** - * Returns a new `AppClient` client for an app instance of the given ID. - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public getAppClientById(params: AppFactoryAppClientParams) { - return new AssetLabelingClient(this.appFactory.getAppClientById(params)) - } - - /** - * Returns a new `AppClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * - * Automatically populates appName, defaultSender and source maps from the factory - * if not specified in the params. - * @param params The parameters to create the app client - * @returns The `AppClient` - */ - public async getAppClientByCreatorAndName( - params: AppFactoryResolveAppClientByCreatorAndNameParams, - ) { - return new AssetLabelingClient(await this.appFactory.getAppClientByCreatorAndName(params)) - } - - /** - * Idempotently deploys the AssetLabeling smart contract. - * - * @param params The arguments for the contract calls and any additional parameters for the call - * @returns The deployment result - */ - public async deploy(params: AssetLabelingDeployParams = {}) { - const result = await this.appFactory.deploy({ - ...params, - }) - return { result: result.result, appClient: new AssetLabelingClient(result.appClient) } - } - - /** - * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AssetLabeling smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The params for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.params.bare.create(params) - }, - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AssetLabeling smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The transaction for a create call - */ - bare: (params?: Expand) => { - return this.appFactory.createTransaction.bare.create(params) - }, - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Gets available create methods - */ - create: { - /** - * Creates a new instance of the AssetLabeling smart contract using a bare call. - * - * @param params The params for the bare (raw) call - * @returns The create result - */ - bare: async (params?: Expand) => { - const result = await this.appFactory.send.bare.create(params) - return { result: result.result, appClient: new AssetLabelingClient(result.appClient) } - }, - }, - - } - -} -/** - * A client to make calls to the AssetLabeling smart contract - */ -export class AssetLabelingClient { - /** - * The underlying `AppClient` for when you want to have more flexibility - */ - public readonly appClient: _AppClient - - /** - * Creates a new instance of `AssetLabelingClient` - * - * @param appClient An `AppClient` instance which has been created with the AssetLabeling app spec - */ - constructor(appClient: _AppClient) - /** - * Creates a new instance of `AssetLabelingClient` - * - * @param params The parameters to initialise the app client with - */ - constructor(params: Omit) - constructor(appClientOrParams: _AppClient | Omit) { - this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ - ...appClientOrParams, - appSpec: APP_SPEC, - }) - } - - /** - * Checks for decode errors on the given return value and maps the return value to the return type for the given method - * @returns The typed return value or undefined if there was no value - */ - decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { - return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined - } - - /** - * Returns a new `AssetLabelingClient` client, resolving the app by creator address and name - * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). - * @param params The parameters to create the app client - */ - public static async fromCreatorAndName(params: Omit): Promise { - return new AssetLabelingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) - } - - /** - * Returns an `AssetLabelingClient` instance for the current network based on - * pre-determined network-specific app IDs specified in the ARC-56 app spec. - * - * If no IDs are in the app spec or the network isn't recognised, an error is thrown. - * @param params The parameters to create the app client - */ - static async fromNetwork( - params: Omit - ): Promise { - return new AssetLabelingClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) - } - - /** The ID of the app instance this client is linked to. */ - public get appId() { - return this.appClient.appId - } - - /** The app address of the app instance this client is linked to. */ - public get appAddress() { - return this.appClient.appAddress - } - - /** The name of the app. */ - public get appName() { - return this.appClient.appName - } - - /** The ARC-56 app spec being used */ - public get appSpec() { - return this.appClient.appSpec - } - - /** A reference to the underlying `AlgorandClient` this app client is using. */ - public get algorand(): AlgorandClient { - return this.appClient.algorand - } - - /** - * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. - */ - readonly params = { - /** - * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.params.bare.clearState(params) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - changeAdmin: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.changeAdmin(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - addLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.addLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - removeLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.removeLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.getLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call params - */ - logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.logLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - addOperatorToLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - removeOperatorFromLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getOperatorLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.getOperatorLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - addLabelToAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.addLabelToAsset(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call params - */ - removeLabelFromAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getAssetLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.getAssetLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.getAssetMicro(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call params - */ - getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicro(params)) - }, - - } - - /** - * Create transactions for the current app - */ - readonly createTransaction = { - /** - * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.createTransaction.bare.clearState(params) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - changeAdmin: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.changeAdmin(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - addLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - removeLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.logLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - addOperatorToLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - removeOperatorFromLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getOperatorLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getOperatorLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - addLabelToAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addLabelToAsset(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - removeLabelFromAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getAssetLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsLabels(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetMicro(params)) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call transaction - */ - getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicro(params)) - }, - - } - - /** - * Send calls to the current app - */ - readonly send = { - /** - * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. - * - * @param params The params for the bare (raw) call - * @returns The clearState result - */ - clearState: (params?: Expand) => { - return this.appClient.send.bare.clearState(params) - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - changeAdmin: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.changeAdmin(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['change_admin(account)void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - addLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.addLabel(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_label(string,string)void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - removeLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeLabel(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_label(string)void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getLabel(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_label(string)(string,uint64,uint64)'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - logLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['log_labels(string[])void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - addOperatorToLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_operator_to_label(account,string)void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - removeOperatorFromLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_operator_from_label(account,string)void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getOperatorLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getOperatorLabels(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_operator_labels(account)string[]'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - addLabelToAsset: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.addLabelToAsset(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_label_to_asset(string,asset)void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. - * - * @param params The params for the smart contract call - * @returns The call result - */ - removeLabelFromAsset: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_label_from_asset(string,asset)void'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getAssetLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetLabels(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_labels(asset)string[]'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getAssetsLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_labels(uint64[])string[][]'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getAssetMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'])} - }, - - /** - * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - getAssetsMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro(uint64[])void'])} - }, - - } - - /** - * Clone this app client with different params - * - * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. - * @returns A new app client with the altered params - */ - public clone(params: CloneAppClientParams) { - return new AssetLabelingClient(this.appClient.clone(params)) - } - - /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - async getLabel(params: CallParams) { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getLabel(params)) - return result.return as unknown as AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] - } - - /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - async logLabels(params: CallParams) { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) - return result.return as unknown as AssetLabelingReturns['log_labels(string[])void'] - } - - /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - async getOperatorLabels(params: CallParams) { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getOperatorLabels(params)) - return result.return as unknown as AssetLabelingReturns['get_operator_labels(account)string[]'] - } - - /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - async getAssetLabels(params: CallParams) { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetLabels(params)) - return result.return as unknown as AssetLabelingReturns['get_asset_labels(asset)string[]'] - } - - /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - async getAssetsLabels(params: CallParams) { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) - return result.return as unknown as AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] - } - - /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - async getAssetMicro(params: CallParams) { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) - return result.return as unknown as AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] - } - - /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. - * - * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. - * - * @param params The params for the smart contract call - * @returns The call result - */ - async getAssetsMicro(params: CallParams) { - const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) - return result.return as unknown as AssetLabelingReturns['get_assets_micro(uint64[])void'] - } - - /** - * Methods to access state for the current AssetLabeling app - */ - state = { - /** - * Methods to access global state for the current AssetLabeling app - */ - global: { - /** - * Get all current keyed values from global state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.global.getAll() - return { - admin: new BinaryStateValue(result.admin), - } - }, - /** - * Get the current value of the admin key in global state - */ - admin: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("admin")) as Uint8Array | undefined) }, - }, - /** - * Methods to access box state for the current AssetLabeling app - */ - box: { - /** - * Get all current keyed values from box state - */ - getAll: async (): Promise>> => { - const result = await this.appClient.state.box.getAll() - return { - } - }, - /** - * Get values from the labels map in box state - */ - labels: { - /** - * Get all current values of the labels map in box state - */ - getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("labels")) as Map }, - /** - * Get a current value of the labels map by key from box state - */ - value: async (key: string): Promise => { return await this.appClient.state.box.getMapValue("labels", key) as LabelDescriptor | undefined }, - }, - /** - * Get values from the assets map in box state - */ - assets: { - /** - * Get all current values of the assets map in box state - */ - getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("assets")) as Map }, - /** - * Get a current value of the assets map by key from box state - */ - value: async (key: bigint): Promise => { return await this.appClient.state.box.getMapValue("assets", key) as string[] | undefined }, - }, - /** - * Get values from the operators map in box state - */ - operators: { - /** - * Get all current values of the operators map in box state - */ - getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("operators")) as Map }, - /** - * Get a current value of the operators map by key from box state - */ - value: async (key: Uint8Array | string): Promise => { return await this.appClient.state.box.getMapValue("operators", key) as string[] | undefined }, - }, - }, - } - - public newGroup(): AssetLabelingComposer { - const client = this - const composer = this.algorand.newGroup() - let promiseChain:Promise = Promise.resolve() - const resultMappers: Array any)> = [] - return { - /** - * Add a change_admin(account)void method call against the AssetLabeling contract - */ - changeAdmin(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeAdmin(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a add_label(string,string)void method call against the AssetLabeling contract - */ - addLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addLabel(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a remove_label(string)void method call against the AssetLabeling contract - */ - removeLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeLabel(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a get_label(string)(string,uint64,uint64) method call against the AssetLabeling contract - */ - getLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getLabel(params))) - resultMappers.push((v) => client.decodeReturnValue('get_label(string)(string,uint64,uint64)', v)) - return this - }, - /** - * Add a log_labels(string[])void method call against the AssetLabeling contract - */ - logLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logLabels(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a add_operator_to_label(account,string)void method call against the AssetLabeling contract - */ - addOperatorToLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addOperatorToLabel(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a remove_operator_from_label(account,string)void method call against the AssetLabeling contract - */ - removeOperatorFromLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeOperatorFromLabel(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a get_operator_labels(account)string[] method call against the AssetLabeling contract - */ - getOperatorLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getOperatorLabels(params))) - resultMappers.push((v) => client.decodeReturnValue('get_operator_labels(account)string[]', v)) - return this - }, - /** - * Add a add_label_to_asset(string,asset)void method call against the AssetLabeling contract - */ - addLabelToAsset(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addLabelToAsset(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a remove_label_from_asset(string,asset)void method call against the AssetLabeling contract - */ - removeLabelFromAsset(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeLabelFromAsset(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a get_asset_labels(asset)string[] method call against the AssetLabeling contract - */ - getAssetLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetLabels(params))) - resultMappers.push((v) => client.decodeReturnValue('get_asset_labels(asset)string[]', v)) - return this - }, - /** - * Add a get_assets_labels(uint64[])string[][] method call against the AssetLabeling contract - */ - getAssetsLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsLabels(params))) - resultMappers.push((v) => client.decodeReturnValue('get_assets_labels(uint64[])string[][]', v)) - return this - }, - /** - * Add a get_asset_micro(uint64)(string,uint8) method call against the AssetLabeling contract - */ - getAssetMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetMicro(params))) - resultMappers.push((v) => client.decodeReturnValue('get_asset_micro(uint64)(string,uint8)', v)) - return this - }, - /** - * Add a get_assets_micro(uint64[])void method call against the AssetLabeling contract - */ - getAssetsMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { - promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsMicro(params))) - resultMappers.push(undefined) - return this - }, - /** - * Add a clear state call to the AssetLabeling contract - */ - clearState(params: AppClientBareCallParams) { - promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) - return this - }, - addTransaction(txn: Transaction, signer?: TransactionSigner) { - promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) - return this - }, - async composer() { - await promiseChain - return composer - }, - async simulate(options?: SimulateOptions) { - await promiseChain - const result = await (!options ? composer.simulate() : composer.simulate(options)) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - }, - async send(params?: SendParams) { - await promiseChain - const result = await composer.send(params) - return { - ...result, - returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) - } - } - } as unknown as AssetLabelingComposer - } -} -export type AssetLabelingComposer = { - /** - * Calls the change_admin(account)void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - changeAdmin(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['change_admin(account)void'] | undefined]> - - /** - * Calls the add_label(string,string)void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - addLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_label(string,string)void'] | undefined]> - - /** - * Calls the remove_label(string)void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - removeLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_label(string)void'] | undefined]> - - /** - * Calls the get_label(string)(string,uint64,uint64) ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] | undefined]> - - /** - * Calls the log_labels(string[])void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - logLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['log_labels(string[])void'] | undefined]> - - /** - * Calls the add_operator_to_label(account,string)void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - addOperatorToLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_operator_to_label(account,string)void'] | undefined]> - - /** - * Calls the remove_operator_from_label(account,string)void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - removeOperatorFromLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_operator_from_label(account,string)void'] | undefined]> - - /** - * Calls the get_operator_labels(account)string[] ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getOperatorLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_operator_labels(account)string[]'] | undefined]> - - /** - * Calls the add_label_to_asset(string,asset)void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - addLabelToAsset(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_label_to_asset(string,asset)void'] | undefined]> - - /** - * Calls the remove_label_from_asset(string,asset)void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - removeLabelFromAsset(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_label_from_asset(string,asset)void'] | undefined]> - - /** - * Calls the get_asset_labels(asset)string[] ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getAssetLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_labels(asset)string[]'] | undefined]> - - /** - * Calls the get_assets_labels(uint64[])string[][] ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getAssetsLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] | undefined]> - - /** - * Calls the get_asset_micro(uint64)(string,uint8) ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getAssetMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] | undefined]> - - /** - * Calls the get_assets_micro(uint64[])void ABI method. - * - * @param args The arguments for the contract call - * @param params Any additional parameters for the call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - getAssetsMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro(uint64[])void'] | undefined]> - - /** - * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. - * - * @param args The arguments for the bare call - * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions - */ - clearState(params?: AppClientBareCallParams): AssetLabelingComposer<[...TReturns, undefined]> - - /** - * Adds a transaction to the composer - * - * @param txn A transaction to add to the transaction group - * @param signer The optional signer to use when signing this transaction. - */ - addTransaction(txn: Transaction, signer?: TransactionSigner): AssetLabelingComposer - /** - * Returns the underlying AtomicTransactionComposer instance - */ - composer(): Promise - /** - * Simulates the transaction group and returns the result - */ - simulate(): Promise & { simulateResponse: SimulateResponse }> - simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> - /** - * Sends the transaction group to the network and returns the results - */ - send(params?: SendParams): Promise> -} -export type AssetLabelingComposerResults = Expand - diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index d804ba7..37bc48c 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -15,7 +15,7 @@ ) from algopy.arc4 import abimethod -from .types import AssetMicro, LabelDescriptor, LabelList, S +from .types import AssetMicro, AssetMicroLabels, LabelDescriptor, LabelList, S NOT_FOUND_KEY = 2**32 # magic constant for "list not found" NOT_FOUND_VALUE = 2**32 - 1 # magic constant for "not found in list" @@ -277,7 +277,12 @@ def get_assets_labels( out.append(empty_list()) return out + # # Batch asset data fetch methods + # + + # Micro: Unit Name, Decimals (max 128) + @subroutine def _get_asset_micro(self, asset_id: UInt64) -> AssetMicro: asset = Asset(asset_id) @@ -294,3 +299,26 @@ def get_asset_micro(self, asset: UInt64) -> AssetMicro: def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: for _i, asset_id in uenumerate(assets): log(self._get_asset_micro(asset_id.native)) + + # Micro: Unit Name, Decimals, Labels (max 64) + + @subroutine + def _get_asset_micro_labels(self, asset_id: UInt64) -> AssetMicroLabels: + asset = Asset(asset_id) + am = AssetMicroLabels( + unit_name=b2str(asset.unit_name), + decimals=arc4.UInt8(asset.decimals), + labels=empty_list(), + ) + if asset in self.assets: + am.labels = self.assets[asset].copy() + return am + + @abimethod(readonly=True) + def get_asset_micro_labels(self, asset: UInt64) -> AssetMicroLabels: + return self._get_asset_micro_labels(asset) + + @abimethod(readonly=True) + def get_assets_micro_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + for _i, asset_id in uenumerate(assets): + log(self._get_asset_micro_labels(asset_id.native)) diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py index 735b5cf..3010f99 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py @@ -14,3 +14,9 @@ class LabelDescriptor(arc4.Struct): class AssetMicro(arc4.Struct): unit_name: arc4.String decimals: arc4.UInt8 + + +class AssetMicroLabels(arc4.Struct): + unit_name: arc4.String + decimals: arc4.UInt8 + labels: LabelList From d67cf154581db44f22acaccaad7d47c416e716e2 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 18:49:16 +0300 Subject: [PATCH 10/15] text views --- .../asset_labeling/contract.py | 39 +++++++++++++++---- .../smart_contracts/asset_labeling/types.py | 10 +++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index 37bc48c..2307afe 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -15,7 +15,14 @@ ) from algopy.arc4 import abimethod -from .types import AssetMicro, AssetMicroLabels, LabelDescriptor, LabelList, S +from .types import ( + AssetMicro, + AssetMicroLabels, + AssetText, + LabelDescriptor, + LabelList, + S, +) NOT_FOUND_KEY = 2**32 # magic constant for "list not found" NOT_FOUND_VALUE = 2**32 - 1 # magic constant for "not found in list" @@ -300,19 +307,16 @@ def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: for _i, asset_id in uenumerate(assets): log(self._get_asset_micro(asset_id.native)) - # Micro: Unit Name, Decimals, Labels (max 64) + # Micro+Label: Unit Name, Decimals, Labels (max 64) @subroutine def _get_asset_micro_labels(self, asset_id: UInt64) -> AssetMicroLabels: asset = Asset(asset_id) - am = AssetMicroLabels( + return AssetMicroLabels( unit_name=b2str(asset.unit_name), decimals=arc4.UInt8(asset.decimals), - labels=empty_list(), + labels=self.assets[asset].copy() if asset in self.assets else empty_list(), ) - if asset in self.assets: - am.labels = self.assets[asset].copy() - return am @abimethod(readonly=True) def get_asset_micro_labels(self, asset: UInt64) -> AssetMicroLabels: @@ -322,3 +326,24 @@ def get_asset_micro_labels(self, asset: UInt64) -> AssetMicroLabels: def get_assets_micro_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: for _i, asset_id in uenumerate(assets): log(self._get_asset_micro_labels(asset_id.native)) + + # Text: Searchable - Asset name, Unit Name, URL, Labels (max 64) + + @subroutine + def _get_asset_text(self, asset_id: UInt64) -> AssetText: + asset = Asset(asset_id) + return AssetText( + name=b2str(asset.name), + unit_name=b2str(asset.unit_name), + url=b2str(asset.url), + labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + ) + + @abimethod(readonly=True) + def get_asset_text(self, asset: UInt64) -> AssetText: + return self._get_asset_text(asset) + + @abimethod(readonly=True) + def get_assets_text(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + for _i, asset_id in uenumerate(assets): + log(self._get_asset_text(asset_id.native)) diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py index 3010f99..448e7f4 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py @@ -11,12 +11,22 @@ class LabelDescriptor(arc4.Struct): num_operators: arc4.UInt64 +# MVP view, e.g. for display an axfer row class AssetMicro(arc4.Struct): unit_name: arc4.String decimals: arc4.UInt8 +# Above plus labels class AssetMicroLabels(arc4.Struct): unit_name: arc4.String decimals: arc4.UInt8 labels: LabelList + + +# Searchable text view +class AssetText(arc4.Struct): + name: arc4.String + unit_name: arc4.String + url: arc4.String + labels: LabelList From 488f498c4b1ac29e578b5d478dbbd05889a3b0d4 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 18:57:02 +0300 Subject: [PATCH 11/15] small view --- .../asset_labeling/contract.py | 32 +++++++++++++++++-- .../smart_contracts/asset_labeling/types.py | 14 ++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index 2307afe..59dac63 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -4,6 +4,7 @@ Asset, BoxMap, Bytes, + Global, String, Txn, UInt64, @@ -18,6 +19,7 @@ from .types import ( AssetMicro, AssetMicroLabels, + AssetSmall, AssetText, LabelDescriptor, LabelList, @@ -288,7 +290,7 @@ def get_assets_labels( # Batch asset data fetch methods # - # Micro: Unit Name, Decimals (max 128) + # Micro: Unit Name, Decimals (1 ref, max 128) @subroutine def _get_asset_micro(self, asset_id: UInt64) -> AssetMicro: @@ -307,7 +309,7 @@ def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: for _i, asset_id in uenumerate(assets): log(self._get_asset_micro(asset_id.native)) - # Micro+Label: Unit Name, Decimals, Labels (max 64) + # Micro+Label: Unit Name, Decimals, Labels (2 refs, max 64) @subroutine def _get_asset_micro_labels(self, asset_id: UInt64) -> AssetMicroLabels: @@ -327,7 +329,7 @@ def get_assets_micro_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> Non for _i, asset_id in uenumerate(assets): log(self._get_asset_micro_labels(asset_id.native)) - # Text: Searchable - Asset name, Unit Name, URL, Labels (max 64) + # Text: Searchable - Asset name, Unit Name, URL, Labels (2 refs, max 64) @subroutine def _get_asset_text(self, asset_id: UInt64) -> AssetText: @@ -347,3 +349,27 @@ def get_asset_text(self, asset: UInt64) -> AssetText: def get_assets_text(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: for _i, asset_id in uenumerate(assets): log(self._get_asset_text(asset_id.native)) + + # small (2 refs, max 64) + + @subroutine + def _get_asset_small(self, asset_id: UInt64) -> AssetSmall: + asset = Asset(asset_id) + return AssetSmall( + name=b2str(asset.name), + unit_name=b2str(asset.unit_name), + decimals=arc4.UInt8(asset.decimals), + total=arc4.UInt64(asset.total), + has_freeze=arc4.Bool(asset.freeze != Global.zero_address), + has_clawback=arc4.Bool(asset.clawback != Global.zero_address), + labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + ) + + @abimethod(readonly=True) + def get_asset_small(self, asset: UInt64) -> AssetSmall: + return self._get_asset_small(asset) + + @abimethod(readonly=True) + def get_assets_small(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + for _i, asset_id in uenumerate(assets): + log(self._get_asset_small(asset_id.native)) diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py index 448e7f4..9535c44 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py @@ -30,3 +30,17 @@ class AssetText(arc4.Struct): unit_name: arc4.String url: arc4.String labels: LabelList + + +# Small view, what a hover card on an explorer may show +class AssetSmall(arc4.Struct): + name: arc4.String + unit_name: arc4.String + decimals: arc4.UInt8 + total: arc4.UInt64 + has_freeze: arc4.Bool + has_clawback: arc4.Bool + labels: LabelList + + +# Full view, everything from algod /v2/assets API + reserve balance From a1ce636e64589e12f65fdfe5034f580c52524ebd Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 19:06:09 +0300 Subject: [PATCH 12/15] assets full view --- .../AssetLabeling.approval.puya.map | 24042 ++++++++++++++++ .../AssetLabeling.approval.teal | 2954 ++ .../asset_labeling/AssetLabeling.arc56.json | 873 + .../AssetLabeling.clear.puya.map | 25 + .../asset_labeling/AssetLabeling.clear.teal | 7 + .../asset_labeling/AssetLabelingClient.ts | 2560 ++ .../asset_labeling/contract.py | 36 + .../smart_contracts/asset_labeling/types.py | 18 + 8 files changed, 30515 insertions(+) create mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map create mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal create mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json create mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map create mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal create mode 100644 projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map new file mode 100644 index 0000000..cc4db02 --- /dev/null +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map @@ -0,0 +1,24042 @@ +{ + "version": 3, + "sources": [ + "../../asset_labeling/contract.py" + ], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDQ;;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAqWK;;AAAA;AAAA;AAAA;;AAAA;AArWL;;;AAqWK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjWL;;;AAAA;AAiWK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAlUL;;;AAkUK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA9TL;;;AAAA;AA8TK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AApBA;;AAAA;AAAA;AAAA;;AAAA;AA1SL;;;AA0SK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAtSL;;;AAAA;AAsSK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AArRL;;;AAqRK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjRL;;;AAAA;AAiRK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AAjQL;;;AAiQK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA7PL;;;AAAA;AA6PK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA3BA;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALA;;;AAEW;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAP;AAaW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAzBR;;;AAyBkC;;AAxBjC;AACA;;AAyBR;;;AAEQ;;;AACA;;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AAnCR;;;AAmC+B;;AAlC9B;AACA;AAkCO;;AAAA;AAAmB;AAAnB;AApCR;;;AAoC8B;;AAnC7B;AACA;AAoCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9CR;;;AA8C2B;AA7C1B;AACA;AA6CO;;AAAA;AAAmB;AAAnB;AA/CR;;;AA+C8B;;AA9C7B;AACA;AA8CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAhDR;;;AAgDyC;;AA/CxC;AACA;AA+CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AArDR;;;AAqD2B;AApD1B;AACA;AAoDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;;AADC;AADJ;;;;AAxEL;;;AA2EK;;AA1EJ;AACA;;;;;;AA4ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA1FR;;;AA0F8B;AAzF7B;AACA;AA0FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;;AADH;AA/FT;;;AAiGS;;AAhGR;AACA;AAmGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAvHR;;;AAuH8B;AAtH7B;AACA;AAsHO;;AAAA;AAAA;;AAxHR;;;AAwHoC;AAvHnC;AACA;AAyHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA7HL;;;AAgIK;AA/HJ;AACA;AAkImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAtIL;;;AAuIK;;AAtIJ;AACA;AAyII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAxJD;AA0JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA9KR;;;AA8K8B;AA7K7B;AACA;AA8KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;;AAA5C;AArLT;;;AAsLS;;AArLR;AACA;AAwLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA1MR;;;AA0M8B;AAzM7B;AACA;AA0MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAlNT;;AAAA;;;AAiOe;AAhOd;AACA;AAkOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAtOD;AAwOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA;AAQR;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAFN;;;;AAAA;AAAA;AAAA;AAAA;AAAP;AAKR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAC2B;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAHJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAnRG;;;;AAyRX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAC6C;AAA7B;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACA;;AAAA;;AAAA;AAAN;;;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAJJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAvSG;;;;AA8SX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACS;;AAAA;;AAAA;AAAZ;AACe;;AAAA;;AAAA;AAAgB;;AAAhB;AAAV;;;AAAA;AAAA;;AAAA;AACY;;AAAA;;AAAA;AAAkB;;AAAlB;AAAV;;;AAAA;AAAA;;AAAA;AACuB;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAPJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA5TG;;;;AAsUX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;;;;AAG+B;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAGhB;;AAAA;;AAAA;;AADH;;;AAAA;;AAAA;;AAAA;;AAAA;AAKW;;AAAA;;AAAA;AAAN;;;AAAA;;AACW;;AAAA;;AAAA;AAAN;;;AAAA;;AACA;;AAAA;;AAAA;AAAN;;;AAAA;;AACc;;AAAA;;AAAA;AAAZ;AAAA;;AACc;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AACY;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AACE;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AAEW;;AAAA;;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AADE;AAAA;;AAEoB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAZJ;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA1VG;;;;AAwVM;;;;AAiBjB;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.__algopy_entrypoint_with_init", + "params": {}, + "block": "main", + "stack_in": [], + "op": "intcblock 1 0 2 8 4294967295 4294967296" + }, + "17": { + "op": "bytecblock 0x151f7c75 \"ERR:NOEXIST\" 0x0000 \"\" \"admin\" \"ERR:EXISTS\" 0x0002 \"ERR:UNAUTH\" \"ERR:LENGTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0001" + }, + "106": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "108": { + "op": "bnz main_after_if_else@2", + "stack_out": [] + }, + "111": { + "op": "bytec 4 // \"admin\"", + "defined_out": [ + "\"admin\"" + ], + "stack_out": [ + "\"admin\"" + ] + }, + "113": { + "op": "txn Sender", + "defined_out": [ + "\"admin\"", + "new_state_value%0#0" + ], + "stack_out": [ + "\"admin\"", + "new_state_value%0#0" + ] + }, + "115": { + "op": "app_global_put", + "stack_out": [] + }, + "116": { + "block": "main_after_if_else@2", + "stack_in": [], + "op": "txn NumAppArgs", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2" + ] + }, + "118": { + "op": "bz main_bare_routing@27", + "stack_out": [] + }, + "121": { + "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0xe1bb95fc 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\", method \"get_asset_micro(uint64)(string,uint8)\", method \"get_assets_micro(uint64[])void\", method \"get_asset_micro_labels(uint64)(string,uint8,string[])\", method \"get_assets_micro_labels(uint64[])void\", method \"get_asset_text(uint64)(string,string,string,string[])\", method \"get_assets_text(uint64[])void\", method \"get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])\", method \"get_assets_small(uint64[])void\", method \"get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])\", method \"get_assets_full(uint64[])void\"", + "defined_out": [ + "Method(add_label(string,string)void)", + "Method(add_label_to_asset(string,asset)void)", + "Method(add_operator_to_label(account,string)void)", + "Method(change_admin(account)void)", + "Method(get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]))", + "Method(get_asset_labels(asset)string[])", + "Method(get_asset_micro(uint64)(string,uint8))", + "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", + "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", + "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_assets_full(uint64[])void)", + "Method(get_assets_labels(uint64[])string[][])", + "Method(get_assets_micro(uint64[])void)", + "Method(get_assets_micro_labels(uint64[])void)", + "Method(get_assets_small(uint64[])void)", + "Method(get_assets_text(uint64[])void)", + "Method(get_label(string)(string,uint64,uint64))", + "Method(get_operator_labels(account)string[])", + "Method(log_labels(string[])void)", + "Method(remove_label(string)void)", + "Method(remove_label_from_asset(string,asset)void)", + "Method(remove_operator_from_label(account,string)void)" + ], + "stack_out": [ + "Method(change_admin(account)void)", + "Method(add_label(string,string)void)", + "Method(remove_label(string)void)", + "Method(get_label(string)(string,uint64,uint64))", + "Method(log_labels(string[])void)", + "Method(add_operator_to_label(account,string)void)", + "Method(remove_operator_from_label(account,string)void)", + "Method(get_operator_labels(account)string[])", + "Method(add_label_to_asset(string,asset)void)", + "Method(remove_label_from_asset(string,asset)void)", + "Method(get_asset_labels(asset)string[])", + "Method(get_assets_labels(uint64[])string[][])", + "Method(get_asset_micro(uint64)(string,uint8))", + "Method(get_assets_micro(uint64[])void)", + "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", + "Method(get_assets_micro_labels(uint64[])void)", + "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_assets_text(uint64[])void)", + "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", + "Method(get_assets_small(uint64[])void)", + "Method(get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]))", + "Method(get_assets_full(uint64[])void)" + ] + }, + "233": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(add_label(string,string)void)", + "Method(add_label_to_asset(string,asset)void)", + "Method(add_operator_to_label(account,string)void)", + "Method(change_admin(account)void)", + "Method(get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]))", + "Method(get_asset_labels(asset)string[])", + "Method(get_asset_micro(uint64)(string,uint8))", + "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", + "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", + "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_assets_full(uint64[])void)", + "Method(get_assets_labels(uint64[])string[][])", + "Method(get_assets_micro(uint64[])void)", + "Method(get_assets_micro_labels(uint64[])void)", + "Method(get_assets_small(uint64[])void)", + "Method(get_assets_text(uint64[])void)", + "Method(get_label(string)(string,uint64,uint64))", + "Method(get_operator_labels(account)string[])", + "Method(log_labels(string[])void)", + "Method(remove_label(string)void)", + "Method(remove_label_from_asset(string,asset)void)", + "Method(remove_operator_from_label(account,string)void)", + "tmp%2#0" + ], + "stack_out": [ + "Method(change_admin(account)void)", + "Method(add_label(string,string)void)", + "Method(remove_label(string)void)", + "Method(get_label(string)(string,uint64,uint64))", + "Method(log_labels(string[])void)", + "Method(add_operator_to_label(account,string)void)", + "Method(remove_operator_from_label(account,string)void)", + "Method(get_operator_labels(account)string[])", + "Method(add_label_to_asset(string,asset)void)", + "Method(remove_label_from_asset(string,asset)void)", + "Method(get_asset_labels(asset)string[])", + "Method(get_assets_labels(uint64[])string[][])", + "Method(get_asset_micro(uint64)(string,uint8))", + "Method(get_assets_micro(uint64[])void)", + "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", + "Method(get_assets_micro_labels(uint64[])void)", + "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_assets_text(uint64[])void)", + "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", + "Method(get_assets_small(uint64[])void)", + "Method(get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]))", + "Method(get_assets_full(uint64[])void)", + "tmp%2#0" + ] + }, + "236": { + "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 main_get_asset_micro_labels_route@19 main_get_assets_micro_labels_route@20 main_get_asset_text_route@21 main_get_assets_text_route@22 main_get_asset_small_route@23 main_get_assets_small_route@24 main_get_asset_full_route@25 main_get_assets_full_route@26", + "stack_out": [] + }, + "282": { + "block": "main_after_if_else@29", + "stack_in": [], + "op": "intc_1 // 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "283": { + "op": "return", + "stack_out": [] + }, + "284": { + "block": "main_get_assets_full_route@26", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%146#0" + ], + "stack_out": [ + "tmp%146#0" + ] + }, + "286": { + "op": "!", + "defined_out": [ + "tmp%147#0" + ], + "stack_out": [ + "tmp%147#0" + ] + }, + "287": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "288": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%148#0" + ], + "stack_out": [ + "tmp%148#0" + ] + }, + "290": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "291": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%150#0" + ], + "stack_out": [ + "tmp%150#0" + ] + }, + "294": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_full", + "op": "callsub get_assets_full", + "stack_out": [] + }, + "297": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "298": { + "op": "return", + "stack_out": [] + }, + "299": { + "block": "main_get_asset_full_route@25", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%139#0" + ], + "stack_out": [ + "tmp%139#0" + ] + }, + "301": { + "op": "!", + "defined_out": [ + "tmp%140#0" + ], + "stack_out": [ + "tmp%140#0" + ] + }, + "302": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "303": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%141#0" + ], + "stack_out": [ + "tmp%141#0" + ] + }, + "305": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "306": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[8]%4#0" + ], + "stack_out": [ + "reinterpret_bytes[8]%4#0" + ] + }, + "309": { + "op": "btoi", + "defined_out": [ + "tmp%143#0" + ], + "stack_out": [ + "tmp%143#0" + ] + }, + "310": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_full", + "op": "callsub get_asset_full", + "defined_out": [ + "tmp%144#0" + ], + "stack_out": [ + "tmp%144#0" + ] + }, + "313": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%144#0" + ], + "stack_out": [ + "tmp%144#0", + "0x151f7c75" + ] + }, + "314": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%144#0" + ] + }, + "315": { + "op": "concat", + "defined_out": [ + "tmp%145#0" + ], + "stack_out": [ + "tmp%145#0" + ] + }, + "316": { + "op": "log", + "stack_out": [] + }, + "317": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "318": { + "op": "return", + "stack_out": [] + }, + "319": { + "block": "main_get_assets_small_route@24", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%134#0" + ], + "stack_out": [ + "tmp%134#0" + ] + }, + "321": { + "op": "!", + "defined_out": [ + "tmp%135#0" + ], + "stack_out": [ + "tmp%135#0" + ] + }, + "322": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "323": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%136#0" + ], + "stack_out": [ + "tmp%136#0" + ] + }, + "325": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "326": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%138#0" + ], + "stack_out": [ + "tmp%138#0" + ] + }, + "329": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_small", + "op": "callsub get_assets_small", + "stack_out": [] + }, + "332": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "333": { + "op": "return", + "stack_out": [] + }, + "334": { + "block": "main_get_asset_small_route@23", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%127#0" + ], + "stack_out": [ + "tmp%127#0" + ] + }, + "336": { + "op": "!", + "defined_out": [ + "tmp%128#0" + ], + "stack_out": [ + "tmp%128#0" + ] + }, + "337": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "338": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%129#0" + ], + "stack_out": [ + "tmp%129#0" + ] + }, + "340": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "341": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[8]%3#0" + ], + "stack_out": [ + "reinterpret_bytes[8]%3#0" + ] + }, + "344": { + "op": "btoi", + "defined_out": [ + "tmp%131#0" + ], + "stack_out": [ + "tmp%131#0" + ] + }, + "345": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_small", + "op": "callsub get_asset_small", + "defined_out": [ + "tmp%132#0" + ], + "stack_out": [ + "tmp%132#0" + ] + }, + "348": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%132#0" + ], + "stack_out": [ + "tmp%132#0", + "0x151f7c75" + ] + }, + "349": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%132#0" + ] + }, + "350": { + "op": "concat", + "defined_out": [ + "tmp%133#0" + ], + "stack_out": [ + "tmp%133#0" + ] + }, + "351": { + "op": "log", + "stack_out": [] + }, + "352": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "353": { + "op": "return", + "stack_out": [] + }, + "354": { + "block": "main_get_assets_text_route@22", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%122#0" + ], + "stack_out": [ + "tmp%122#0" + ] + }, + "356": { + "op": "!", + "defined_out": [ + "tmp%123#0" + ], + "stack_out": [ + "tmp%123#0" + ] + }, + "357": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "358": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%124#0" + ], + "stack_out": [ + "tmp%124#0" + ] + }, + "360": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "361": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%126#0" + ], + "stack_out": [ + "tmp%126#0" + ] + }, + "364": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text", + "op": "callsub get_assets_text", + "stack_out": [] + }, + "367": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "368": { + "op": "return", + "stack_out": [] + }, + "369": { + "block": "main_get_asset_text_route@21", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%115#0" + ], + "stack_out": [ + "tmp%115#0" + ] + }, + "371": { + "op": "!", + "defined_out": [ + "tmp%116#0" + ], + "stack_out": [ + "tmp%116#0" + ] + }, + "372": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "373": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%117#0" + ], + "stack_out": [ + "tmp%117#0" + ] + }, + "375": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "376": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[8]%2#0" + ], + "stack_out": [ + "reinterpret_bytes[8]%2#0" + ] + }, + "379": { + "op": "btoi", + "defined_out": [ + "tmp%119#0" + ], + "stack_out": [ + "tmp%119#0" + ] + }, + "380": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text", + "op": "callsub get_asset_text", + "defined_out": [ + "tmp%120#0" + ], + "stack_out": [ + "tmp%120#0" + ] + }, + "383": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%120#0" + ], + "stack_out": [ + "tmp%120#0", + "0x151f7c75" + ] + }, + "384": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%120#0" + ] + }, + "385": { + "op": "concat", + "defined_out": [ + "tmp%121#0" + ], + "stack_out": [ + "tmp%121#0" + ] + }, + "386": { + "op": "log", + "stack_out": [] + }, + "387": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "388": { + "op": "return", + "stack_out": [] + }, + "389": { + "block": "main_get_assets_micro_labels_route@20", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%110#0" + ], + "stack_out": [ + "tmp%110#0" + ] + }, + "391": { + "op": "!", + "defined_out": [ + "tmp%111#0" + ], + "stack_out": [ + "tmp%111#0" + ] + }, + "392": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "393": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%112#0" + ], + "stack_out": [ + "tmp%112#0" + ] + }, + "395": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "396": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%114#0" + ], + "stack_out": [ + "tmp%114#0" + ] + }, + "399": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro_labels", + "op": "callsub get_assets_micro_labels", + "stack_out": [] + }, + "402": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "403": { + "op": "return", + "stack_out": [] + }, + "404": { + "block": "main_get_asset_micro_labels_route@19", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%103#0" + ], + "stack_out": [ + "tmp%103#0" + ] + }, + "406": { + "op": "!", + "defined_out": [ + "tmp%104#0" + ], + "stack_out": [ + "tmp%104#0" + ] + }, + "407": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "408": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%105#0" + ], + "stack_out": [ + "tmp%105#0" + ] + }, + "410": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "411": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[8]%1#0" + ], + "stack_out": [ + "reinterpret_bytes[8]%1#0" + ] + }, + "414": { + "op": "btoi", + "defined_out": [ + "tmp%107#0" + ], + "stack_out": [ + "tmp%107#0" + ] + }, + "415": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro_labels", + "op": "callsub get_asset_micro_labels", + "defined_out": [ + "tmp%108#0" + ], + "stack_out": [ + "tmp%108#0" + ] + }, + "418": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%108#0" + ], + "stack_out": [ + "tmp%108#0", + "0x151f7c75" + ] + }, + "419": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%108#0" + ] + }, + "420": { + "op": "concat", + "defined_out": [ + "tmp%109#0" + ], + "stack_out": [ + "tmp%109#0" + ] + }, + "421": { + "op": "log", + "stack_out": [] + }, + "422": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "423": { + "op": "return", + "stack_out": [] + }, + "424": { + "block": "main_get_assets_micro_route@18", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%98#0" + ], + "stack_out": [ + "tmp%98#0" + ] + }, + "426": { + "op": "!", + "defined_out": [ + "tmp%99#0" + ], + "stack_out": [ + "tmp%99#0" + ] + }, + "427": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "428": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%100#0" + ], + "stack_out": [ + "tmp%100#0" + ] + }, + "430": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "431": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%102#0" + ], + "stack_out": [ + "tmp%102#0" + ] + }, + "434": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", + "op": "callsub get_assets_micro", + "stack_out": [] + }, + "437": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "438": { + "op": "return", + "stack_out": [] + }, + "439": { + "block": "main_get_asset_micro_route@17", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%91#0" + ], + "stack_out": [ + "tmp%91#0" + ] + }, + "441": { + "op": "!", + "defined_out": [ + "tmp%92#0" + ], + "stack_out": [ + "tmp%92#0" + ] + }, + "442": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "443": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%93#0" + ], + "stack_out": [ + "tmp%93#0" + ] + }, + "445": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "446": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[8]%0#0" + ], + "stack_out": [ + "reinterpret_bytes[8]%0#0" + ] + }, + "449": { + "op": "btoi", + "defined_out": [ + "tmp%95#0" + ], + "stack_out": [ + "tmp%95#0" + ] + }, + "450": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", + "op": "callsub get_asset_micro", + "defined_out": [ + "tmp%96#0" + ], + "stack_out": [ + "tmp%96#0" + ] + }, + "453": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%96#0" + ], + "stack_out": [ + "tmp%96#0", + "0x151f7c75" + ] + }, + "454": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%96#0" + ] + }, + "455": { + "op": "concat", + "defined_out": [ + "tmp%97#0" + ], + "stack_out": [ + "tmp%97#0" + ] + }, + "456": { + "op": "log", + "stack_out": [] + }, + "457": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "458": { + "op": "return", + "stack_out": [] + }, + "459": { + "block": "main_get_assets_labels_route@16", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%84#0" + ], + "stack_out": [ + "tmp%84#0" + ] + }, + "461": { + "op": "!", + "defined_out": [ + "tmp%85#0" + ], + "stack_out": [ + "tmp%85#0" + ] + }, + "462": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "463": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%86#0" + ], + "stack_out": [ + "tmp%86#0" + ] + }, + "465": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "466": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%88#0" + ], + "stack_out": [ + "tmp%88#0" + ] + }, + "469": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", + "op": "callsub get_assets_labels", + "defined_out": [ + "tmp%89#0" + ], + "stack_out": [ + "tmp%89#0" + ] + }, + "472": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%89#0" + ], + "stack_out": [ + "tmp%89#0", + "0x151f7c75" + ] + }, + "473": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%89#0" + ] + }, + "474": { + "op": "concat", + "defined_out": [ + "tmp%90#0" + ], + "stack_out": [ + "tmp%90#0" + ] + }, + "475": { + "op": "log", + "stack_out": [] + }, + "476": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "477": { + "op": "return", + "stack_out": [] + }, + "478": { + "block": "main_get_asset_labels_route@15", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%76#0" + ], + "stack_out": [ + "tmp%76#0" + ] + }, + "480": { + "op": "!", + "defined_out": [ + "tmp%77#0" + ], + "stack_out": [ + "tmp%77#0" + ] + }, + "481": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "482": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%78#0" + ], + "stack_out": [ + "tmp%78#0" + ] + }, + "484": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "485": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[1]%6#0" + ], + "stack_out": [ + "reinterpret_bytes[1]%6#0" + ] + }, + "488": { + "op": "btoi", + "defined_out": [ + "tmp%80#0" + ], + "stack_out": [ + "tmp%80#0" + ] + }, + "489": { + "op": "txnas Assets", + "defined_out": [ + "tmp%81#0" + ], + "stack_out": [ + "tmp%81#0" + ] + }, + "491": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", + "op": "callsub get_asset_labels", + "defined_out": [ + "tmp%82#0" + ], + "stack_out": [ + "tmp%82#0" + ] + }, + "494": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%82#0" + ], + "stack_out": [ + "tmp%82#0", + "0x151f7c75" + ] + }, + "495": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%82#0" + ] + }, + "496": { + "op": "concat", + "defined_out": [ + "tmp%83#0" + ], + "stack_out": [ + "tmp%83#0" + ] + }, + "497": { + "op": "log", + "stack_out": [] + }, + "498": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "499": { + "op": "return", + "stack_out": [] + }, + "500": { + "block": "main_remove_label_from_asset_route@14", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%68#0" + ], + "stack_out": [ + "tmp%68#0" + ] + }, + "502": { + "op": "!", + "defined_out": [ + "tmp%69#0" + ], + "stack_out": [ + "tmp%69#0" + ] + }, + "503": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "504": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%70#0" + ], + "stack_out": [ + "tmp%70#0" + ] + }, + "506": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "507": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%72#0" + ], + "stack_out": [ + "tmp%72#0" + ] + }, + "510": { + "op": "extract 2 0", + "defined_out": [ + "tmp%73#0" + ], + "stack_out": [ + "tmp%73#0" + ] + }, + "513": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "reinterpret_bytes[1]%5#0", + "tmp%73#0" + ], + "stack_out": [ + "tmp%73#0", + "reinterpret_bytes[1]%5#0" + ] + }, + "516": { + "op": "btoi", + "defined_out": [ + "tmp%73#0", + "tmp%74#0" + ], + "stack_out": [ + "tmp%73#0", + "tmp%74#0" + ] + }, + "517": { + "op": "txnas Assets", + "defined_out": [ + "tmp%73#0", + "tmp%75#0" + ], + "stack_out": [ + "tmp%73#0", + "tmp%75#0" + ] + }, + "519": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", + "op": "callsub remove_label_from_asset", + "stack_out": [] + }, + "522": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "523": { + "op": "return", + "stack_out": [] + }, + "524": { + "block": "main_add_label_to_asset_route@13", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%60#0" + ], + "stack_out": [ + "tmp%60#0" + ] + }, + "526": { + "op": "!", + "defined_out": [ + "tmp%61#0" + ], + "stack_out": [ + "tmp%61#0" + ] + }, + "527": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "528": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%62#0" + ], + "stack_out": [ + "tmp%62#0" + ] + }, + "530": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "531": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%64#0" + ], + "stack_out": [ + "tmp%64#0" + ] + }, + "534": { + "op": "extract 2 0", + "defined_out": [ + "tmp%65#0" + ], + "stack_out": [ + "tmp%65#0" + ] + }, + "537": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "reinterpret_bytes[1]%4#0", + "tmp%65#0" + ], + "stack_out": [ + "tmp%65#0", + "reinterpret_bytes[1]%4#0" + ] + }, + "540": { + "op": "btoi", + "defined_out": [ + "tmp%65#0", + "tmp%66#0" + ], + "stack_out": [ + "tmp%65#0", + "tmp%66#0" + ] + }, + "541": { + "op": "txnas Assets", + "defined_out": [ + "tmp%65#0", + "tmp%67#0" + ], + "stack_out": [ + "tmp%65#0", + "tmp%67#0" + ] + }, + "543": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", + "op": "callsub add_label_to_asset", + "stack_out": [] + }, + "546": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "547": { + "op": "return", + "stack_out": [] + }, + "548": { + "block": "main_get_operator_labels_route@12", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%52#0" + ], + "stack_out": [ + "tmp%52#0" + ] + }, + "550": { + "op": "!", + "defined_out": [ + "tmp%53#0" + ], + "stack_out": [ + "tmp%53#0" + ] + }, + "551": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "552": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%54#0" + ], + "stack_out": [ + "tmp%54#0" + ] + }, + "554": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "555": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[1]%3#0" + ], + "stack_out": [ + "reinterpret_bytes[1]%3#0" + ] + }, + "558": { + "op": "btoi", + "defined_out": [ + "tmp%56#0" + ], + "stack_out": [ + "tmp%56#0" + ] + }, + "559": { + "op": "txnas Accounts", + "defined_out": [ + "tmp%57#0" + ], + "stack_out": [ + "tmp%57#0" + ] + }, + "561": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", + "op": "callsub get_operator_labels", + "defined_out": [ + "tmp%58#0" + ], + "stack_out": [ + "tmp%58#0" + ] + }, + "564": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%58#0" + ], + "stack_out": [ + "tmp%58#0", + "0x151f7c75" + ] + }, + "565": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%58#0" + ] + }, + "566": { + "op": "concat", + "defined_out": [ + "tmp%59#0" + ], + "stack_out": [ + "tmp%59#0" + ] + }, + "567": { + "op": "log", + "stack_out": [] + }, + "568": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "569": { + "op": "return", + "stack_out": [] + }, + "570": { + "block": "main_remove_operator_from_label_route@11", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%44#0" + ], + "stack_out": [ + "tmp%44#0" + ] + }, + "572": { + "op": "!", + "defined_out": [ + "tmp%45#0" + ], + "stack_out": [ + "tmp%45#0" + ] + }, + "573": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "574": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%46#0" + ], + "stack_out": [ + "tmp%46#0" + ] + }, + "576": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "577": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[1]%2#0" + ], + "stack_out": [ + "reinterpret_bytes[1]%2#0" + ] + }, + "580": { + "op": "btoi", + "defined_out": [ + "tmp%48#0" + ], + "stack_out": [ + "tmp%48#0" + ] + }, + "581": { + "op": "txnas Accounts", + "defined_out": [ + "tmp%49#0" + ], + "stack_out": [ + "tmp%49#0" + ] + }, + "583": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%49#0", + "tmp%50#0" + ], + "stack_out": [ + "tmp%49#0", + "tmp%50#0" + ] + }, + "586": { + "op": "extract 2 0", + "defined_out": [ + "tmp%49#0", + "tmp%51#0" + ], + "stack_out": [ + "tmp%49#0", + "tmp%51#0" + ] + }, + "589": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", + "op": "callsub remove_operator_from_label", + "stack_out": [] + }, + "592": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "593": { + "op": "return", + "stack_out": [] + }, + "594": { + "block": "main_add_operator_to_label_route@10", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%36#0" + ], + "stack_out": [ + "tmp%36#0" + ] + }, + "596": { + "op": "!", + "defined_out": [ + "tmp%37#0" + ], + "stack_out": [ + "tmp%37#0" + ] + }, + "597": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "598": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%38#0" + ], + "stack_out": [ + "tmp%38#0" + ] + }, + "600": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "601": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[1]%1#0" + ], + "stack_out": [ + "reinterpret_bytes[1]%1#0" + ] + }, + "604": { + "op": "btoi", + "defined_out": [ + "tmp%40#0" + ], + "stack_out": [ + "tmp%40#0" + ] + }, + "605": { + "op": "txnas Accounts", + "defined_out": [ + "tmp%41#0" + ], + "stack_out": [ + "tmp%41#0" + ] + }, + "607": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%41#0", + "tmp%42#0" + ], + "stack_out": [ + "tmp%41#0", + "tmp%42#0" + ] + }, + "610": { + "op": "extract 2 0", + "defined_out": [ + "tmp%41#0", + "tmp%43#0" + ], + "stack_out": [ + "tmp%41#0", + "tmp%43#0" + ] + }, + "613": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", + "op": "callsub add_operator_to_label", + "stack_out": [] + }, + "616": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "617": { + "op": "return", + "stack_out": [] + }, + "618": { + "block": "main_log_labels_route@9", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%31#0" + ], + "stack_out": [ + "tmp%31#0" + ] + }, + "620": { + "op": "!", + "defined_out": [ + "tmp%32#0" + ], + "stack_out": [ + "tmp%32#0" + ] + }, + "621": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "622": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%33#0" + ], + "stack_out": [ + "tmp%33#0" + ] + }, + "624": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "625": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%35#0" + ], + "stack_out": [ + "tmp%35#0" + ] + }, + "628": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", + "op": "callsub log_labels", + "stack_out": [] + }, + "631": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "632": { + "op": "return", + "stack_out": [] + }, + "633": { + "block": "main_get_label_route@8", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%23#0" + ], + "stack_out": [ + "tmp%23#0" + ] + }, + "635": { + "op": "!", + "defined_out": [ + "tmp%24#0" + ], + "stack_out": [ + "tmp%24#0" + ] + }, + "636": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "637": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%25#0" + ], + "stack_out": [ + "tmp%25#0" + ] + }, + "639": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "640": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%27#0" + ], + "stack_out": [ + "tmp%27#0" + ] + }, + "643": { + "op": "extract 2 0", + "defined_out": [ + "tmp%28#0" + ], + "stack_out": [ + "tmp%28#0" + ] + }, + "646": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", + "op": "callsub get_label", + "defined_out": [ + "tmp%29#0" + ], + "stack_out": [ + "tmp%29#0" + ] + }, + "649": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%29#0" + ], + "stack_out": [ + "tmp%29#0", + "0x151f7c75" + ] + }, + "650": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%29#0" + ] + }, + "651": { + "op": "concat", + "defined_out": [ + "tmp%30#0" + ], + "stack_out": [ + "tmp%30#0" + ] + }, + "652": { + "op": "log", + "stack_out": [] + }, + "653": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "654": { + "op": "return", + "stack_out": [] + }, + "655": { + "block": "main_remove_label_route@7", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%17#0" + ], + "stack_out": [ + "tmp%17#0" + ] + }, + "657": { + "op": "!", + "defined_out": [ + "tmp%18#0" + ], + "stack_out": [ + "tmp%18#0" + ] + }, + "658": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "659": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%19#0" + ], + "stack_out": [ + "tmp%19#0" + ] + }, + "661": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "662": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%21#0" + ], + "stack_out": [ + "tmp%21#0" + ] + }, + "665": { + "op": "extract 2 0", + "defined_out": [ + "tmp%22#0" + ], + "stack_out": [ + "tmp%22#0" + ] + }, + "668": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", + "op": "callsub remove_label", + "stack_out": [] + }, + "671": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "672": { + "op": "return", + "stack_out": [] + }, + "673": { + "block": "main_add_label_route@6", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%9#0" + ], + "stack_out": [ + "tmp%9#0" + ] + }, + "675": { + "op": "!", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "tmp%10#0" + ] + }, + "676": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "677": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%11#0" + ], + "stack_out": [ + "tmp%11#0" + ] + }, + "679": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "680": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%13#0" + ], + "stack_out": [ + "tmp%13#0" + ] + }, + "683": { + "op": "extract 2 0", + "defined_out": [ + "tmp%14#0" + ], + "stack_out": [ + "tmp%14#0" + ] + }, + "686": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%14#0", + "tmp%15#0" + ], + "stack_out": [ + "tmp%14#0", + "tmp%15#0" + ] + }, + "689": { + "op": "extract 2 0", + "defined_out": [ + "tmp%14#0", + "tmp%16#0" + ], + "stack_out": [ + "tmp%14#0", + "tmp%16#0" + ] + }, + "692": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", + "op": "callsub add_label", + "stack_out": [] + }, + "695": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "696": { + "op": "return", + "stack_out": [] + }, + "697": { + "block": "main_change_admin_route@5", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "699": { + "op": "!", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "700": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "701": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "703": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "704": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[1]%0#0" + ], + "stack_out": [ + "reinterpret_bytes[1]%0#0" + ] + }, + "707": { + "op": "btoi", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "708": { + "op": "txnas Accounts", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "710": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", + "op": "callsub change_admin", + "stack_out": [] + }, + "713": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "714": { + "op": "return", + "stack_out": [] + }, + "715": { + "block": "main_bare_routing@27", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%151#0" + ], + "stack_out": [ + "tmp%151#0" + ] + }, + "717": { + "op": "bnz main_after_if_else@29", + "stack_out": [] + }, + "720": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%152#0" + ], + "stack_out": [ + "tmp%152#0" + ] + }, + "722": { + "op": "!", + "defined_out": [ + "tmp%153#0" + ], + "stack_out": [ + "tmp%153#0" + ] + }, + "723": { + "error": "can only call when creating", + "op": "assert // can only call when creating", + "stack_out": [] + }, + "724": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "725": { + "op": "return", + "stack_out": [] + }, + "726": { + "subroutine": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "params": { + "array#0": "bytes", + "new_items_bytes#0": "bytes", + "new_items_count#0": "uint64" + }, + "block": "dynamic_array_concat_byte_length_head", + "stack_in": [], + "op": "proto 3 1" + }, + "729": { + "op": "frame_dig -3", + "defined_out": [ + "array#0 (copy)" + ], + "stack_out": [ + "array#0 (copy)" + ] + }, + "731": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "array#0 (copy)" + ], + "stack_out": [ + "array#0 (copy)", + "0" + ] + }, + "732": { + "op": "extract_uint16", + "defined_out": [ + "array_length#0" + ], + "stack_out": [ + "array_length#0" + ] + }, + "733": { + "op": "dup", + "defined_out": [ + "array_length#0", + "array_length#0 (copy)" + ], + "stack_out": [ + "array_length#0", + "array_length#0 (copy)" + ] + }, + "734": { + "op": "frame_dig -1", + "defined_out": [ + "array_length#0", + "array_length#0 (copy)", + "new_items_count#0 (copy)" + ], + "stack_out": [ + "array_length#0", + "array_length#0 (copy)", + "new_items_count#0 (copy)" + ] + }, + "736": { + "op": "+", + "defined_out": [ + "array_length#0", + "new_length#0" + ], + "stack_out": [ + "array_length#0", + "new_length#0" + ] + }, + "737": { + "op": "swap", + "stack_out": [ + "new_length#0", + "array_length#0" + ] + }, + "738": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_length#0", + "new_length#0" + ], + "stack_out": [ + "new_length#0", + "array_length#0", + "2" + ] + }, + "739": { + "op": "*", + "defined_out": [ + "new_length#0", + "tmp%0#0" + ], + "stack_out": [ + "new_length#0", + "tmp%0#0" + ] + }, + "740": { + "op": "intc_2 // 2", + "stack_out": [ + "new_length#0", + "tmp%0#0", + "2" + ] + }, + "741": { + "op": "+", + "defined_out": [ + "header_end#0", + "new_length#0" + ], + "stack_out": [ + "new_length#0", + "header_end#0" + ] + }, + "742": { + "op": "dig 1", + "defined_out": [ + "header_end#0", + "new_length#0", + "new_length#0 (copy)" + ], + "stack_out": [ + "new_length#0", + "header_end#0", + "new_length#0 (copy)" + ] + }, + "744": { + "op": "itob", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%1#0" + ], + "stack_out": [ + "new_length#0", + "header_end#0", + "tmp%1#0" + ] + }, + "745": { + "op": "extract 6 2", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%2#0" + ], + "stack_out": [ + "new_length#0", + "header_end#0", + "tmp%2#0" + ] + }, + "748": { + "op": "cover 2", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0" + ] + }, + "750": { + "op": "frame_dig -3", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "array#0 (copy)" + ] + }, + "752": { + "op": "intc_2 // 2", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "array#0 (copy)", + "2" + ] + }, + "753": { + "op": "dig 2", + "defined_out": [ + "2", + "array#0 (copy)", + "header_end#0", + "header_end#0 (copy)", + "new_length#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "array#0 (copy)", + "2", + "header_end#0 (copy)" + ] + }, + "755": { + "op": "substring3", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%3#0" + ] + }, + "756": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%3#0", + "new_items_count#0 (copy)" + ] + }, + "758": { + "op": "intc_2 // 2", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%3#0", + "new_items_count#0 (copy)", + "2" + ] + }, + "759": { + "op": "*", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%2#0", + "tmp%3#0", + "tmp%4#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%3#0", + "tmp%4#0" + ] + }, + "760": { + "op": "bzero", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%2#0", + "tmp%3#0", + "tmp%5#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%3#0", + "tmp%5#0" + ] + }, + "761": { + "op": "concat", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%2#0", + "tmp%6#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%6#0" + ] + }, + "762": { + "op": "frame_dig -3", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%6#0", + "array#0 (copy)" + ] + }, + "764": { + "op": "len", + "defined_out": [ + "header_end#0", + "new_length#0", + "tmp%2#0", + "tmp%6#0", + "tmp%7#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%6#0", + "tmp%7#0" + ] + }, + "765": { + "op": "frame_dig -3", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "header_end#0", + "tmp%6#0", + "tmp%7#0", + "array#0 (copy)" + ] + }, + "767": { + "op": "uncover 3", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "tmp%6#0", + "tmp%7#0", + "array#0 (copy)", + "header_end#0" + ] + }, + "769": { + "op": "uncover 2", + "stack_out": [ + "tmp%2#0", + "new_length#0", + "tmp%6#0", + "array#0 (copy)", + "header_end#0", + "tmp%7#0" + ] + }, + "771": { + "op": "substring3", + "defined_out": [ + "new_length#0", + "tmp%2#0", + "tmp%6#0", + "tmp%8#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "tmp%6#0", + "tmp%8#0" + ] + }, + "772": { + "op": "concat", + "defined_out": [ + "new_length#0", + "tmp%2#0", + "tmp%9#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "tmp%9#0" + ] + }, + "773": { + "op": "frame_dig -2", + "defined_out": [ + "new_items_bytes#0 (copy)", + "new_length#0", + "tmp%2#0", + "tmp%9#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "tmp%9#0", + "new_items_bytes#0 (copy)" + ] + }, + "775": { + "op": "concat", + "defined_out": [ + "array_head_and_tail#0", + "new_length#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "new_length#0", + "array_head_and_tail#0" + ] + }, + "776": { + "op": "swap", + "defined_out": [ + "array_head_and_tail#0", + "new_length#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "new_length#0" + ] + }, + "777": { + "op": "intc_2 // 2", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "new_length#0", + "2" + ] + }, + "778": { + "op": "*", + "defined_out": [ + "array_head_and_tail#0", + "tail_offset#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0" + ] + }, + "779": { + "op": "dup", + "defined_out": [ + "array_head_and_tail#0", + "tail_offset#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "tail_offset#0" + ] + }, + "780": { + "op": "intc_1 // 0", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "tail_offset#0", + "head_offset#0" + ] + }, + "781": { + "op": "swap", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1" + ] + }, + "782": { + "block": "dynamic_array_concat_byte_length_head_for_header@2", + "stack_in": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1" + ], + "op": "frame_dig 3", + "defined_out": [ + "head_offset#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0" + ] + }, + "784": { + "op": "frame_dig 2", + "defined_out": [ + "head_offset#0", + "tail_offset#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#0" + ] + }, + "786": { + "op": "<", + "defined_out": [ + "continue_looping%0#0", + "head_offset#0", + "tail_offset#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "continue_looping%0#0" + ] + }, + "787": { + "op": "bz dynamic_array_concat_byte_length_head_after_for@5", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1" + ] + }, + "790": { + "op": "frame_dig 4", + "defined_out": [ + "head_offset#0", + "tail_offset#0", + "tail_offset#1" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tail_offset#1" + ] + }, + "792": { + "op": "dup", + "defined_out": [ + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tail_offset#1 (copy)" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tail_offset#1", + "tail_offset#1 (copy)" + ] + }, + "793": { + "op": "itob", + "defined_out": [ + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tmp%5#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tail_offset#1", + "tmp%5#0" + ] + }, + "794": { + "op": "extract 6 2", + "defined_out": [ + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tail_offset_bytes#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tail_offset#1", + "tail_offset_bytes#0" + ] + }, + "797": { + "op": "frame_dig 1", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tail_offset_bytes#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tail_offset#1", + "tail_offset_bytes#0", + "array_head_and_tail#0" + ] + }, + "799": { + "op": "frame_dig 3", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tail_offset#1", + "tail_offset_bytes#0", + "array_head_and_tail#0", + "head_offset#0" + ] + }, + "801": { + "op": "dup", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "head_offset#0 (copy)", + "tail_offset#0", + "tail_offset#1", + "tail_offset_bytes#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tail_offset#1", + "tail_offset_bytes#0", + "array_head_and_tail#0", + "head_offset#0 (copy)", + "head_offset#0 (copy)" + ] + }, + "802": { + "op": "cover 4", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "tail_offset_bytes#0", + "array_head_and_tail#0", + "head_offset#0 (copy)" + ] + }, + "804": { + "op": "uncover 2", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "array_head_and_tail#0", + "head_offset#0 (copy)", + "tail_offset_bytes#0" + ] + }, + "806": { + "op": "replace3", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "array_head_and_tail#0" + ] + }, + "807": { + "op": "dup", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "array_head_and_tail#0", + "array_head_and_tail#0" + ] + }, + "808": { + "op": "frame_bury 1", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tail_offset#1" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "array_head_and_tail#0" + ] + }, + "810": { + "op": "dig 1", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "array_head_and_tail#0", + "tail_offset#1 (copy)" + ] + }, + "812": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tmp%6#1" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "tmp%6#1" + ] + }, + "813": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tmp%6#1" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "tmp%6#1", + "2" + ] + }, + "814": { + "op": "+", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tail_offset#1", + "tmp%7#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1", + "tmp%7#0" + ] + }, + "815": { + "op": "+", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "tail_offset#1" + ] + }, + "816": { + "op": "frame_bury 4", + "defined_out": [ + "array_head_and_tail#0", + "head_offset#0", + "tail_offset#0", + "tail_offset#1" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0" + ] + }, + "818": { + "op": "intc_2 // 2", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0", + "2" + ] + }, + "819": { + "op": "+", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "head_offset#0" + ] + }, + "820": { + "op": "frame_bury 3", + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1" + ] + }, + "822": { + "op": "b dynamic_array_concat_byte_length_head_for_header@2" + }, + "825": { + "block": "dynamic_array_concat_byte_length_head_after_for@5", + "stack_in": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1" + ], + "op": "frame_dig 0", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tmp%2#0" + ] + }, + "827": { + "op": "frame_dig 1", + "defined_out": [ + "array_head_and_tail#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tmp%2#0", + "array_head_and_tail#0" + ] + }, + "829": { + "op": "concat", + "defined_out": [ + "array_head_and_tail#0", + "tmp%12#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "array_head_and_tail#0", + "tail_offset#0", + "head_offset#0", + "tail_offset#1", + "tmp%12#0" + ] + }, + "830": { + "op": "frame_bury 0" + }, + "832": { + "retsub": true, + "op": "retsub" + }, + "833": { + "subroutine": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", + "params": { + "array_items_count#0": "uint64", + "array_head_and_tail#0": "bytes", + "new_items_count#0": "uint64", + "new_head_and_tail#0": "bytes" + }, + "block": "dynamic_array_concat_dynamic_element", + "stack_in": [], + "op": "proto 4 1" + }, + "836": { + "op": "bytec_3 // \"\"", + "stack_out": [ + "item_offset_adjustment#2" + ] + }, + "837": { + "op": "dup" + }, + "838": { + "op": "frame_dig -2" + }, + "840": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "new_head#0", + "new_items_count#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "new_items_count#0 (copy)", + "2" + ] + }, + "841": { + "op": "*", + "defined_out": [ + "item_offset_adjustment#0", + "new_head#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0" + ] + }, + "842": { + "op": "frame_dig -4", + "defined_out": [ + "array_items_count#0 (copy)", + "item_offset_adjustment#0", + "new_head#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "array_items_count#0 (copy)" + ] + }, + "844": { + "op": "intc_2 // 2", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "array_items_count#0 (copy)", + "2" + ] + }, + "845": { + "op": "*", + "defined_out": [ + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0" + ] + }, + "846": { + "op": "intc_1 // 0", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ] + }, + "847": { + "block": "dynamic_array_concat_dynamic_element_for_header@1", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig 4", + "defined_out": [ + "head_offset#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "849": { + "op": "frame_dig 3", + "defined_out": [ + "head_offset#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%0#0" + ] + }, + "851": { + "op": "<", + "defined_out": [ + "continue_looping%0#0", + "head_offset#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "continue_looping%0#0" + ] + }, + "852": { + "op": "bz dynamic_array_concat_dynamic_element_after_for@4", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ] + }, + "855": { + "op": "frame_dig -3", + "defined_out": [ + "array_head_and_tail#0 (copy)", + "head_offset#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)" + ] + }, + "857": { + "op": "frame_dig 4", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)", + "head_offset#0" + ] + }, + "859": { + "op": "dup", + "defined_out": [ + "array_head_and_tail#0 (copy)", + "head_offset#0", + "head_offset#0 (copy)", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)", + "head_offset#0 (copy)", + "head_offset#0 (copy)" + ] + }, + "860": { + "op": "cover 2", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "array_head_and_tail#0 (copy)", + "head_offset#0 (copy)" + ] + }, + "862": { + "op": "extract_uint16", + "defined_out": [ + "head_offset#0", + "item_offset#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0" + ] + }, + "863": { + "op": "frame_dig 2", + "defined_out": [ + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0" + ] + }, + "865": { + "op": "+", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%1#0" + ] + }, + "866": { + "op": "itob", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "tmp%0#0", + "tmp%2#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%2#0" + ] + }, + "867": { + "op": "extract 6 2", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "tmp%0#0", + "tmp%3#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%3#0" + ] + }, + "870": { + "op": "frame_dig 1", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0", + "tmp%3#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%3#0", + "new_head#0" + ] + }, + "872": { + "op": "swap", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0", + "tmp%3#0" + ] + }, + "873": { + "op": "concat", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0" + ] + }, + "874": { + "op": "frame_bury 1", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "876": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "2" + ] + }, + "877": { + "op": "+", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "878": { + "op": "frame_bury 4", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "new_head#0", + "tmp%0#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ] + }, + "880": { + "op": "b dynamic_array_concat_dynamic_element_for_header@1" + }, + "883": { + "block": "dynamic_array_concat_dynamic_element_after_for@4", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig -3", + "defined_out": [ + "array_head_and_tail#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_head_and_tail#0 (copy)" + ] + }, + "885": { + "op": "len", + "defined_out": [ + "item_offset_adjustment#2" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "item_offset_adjustment#2" + ] + }, + "886": { + "op": "frame_bury 0", + "defined_out": [ + "item_offset_adjustment#2" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ] + }, + "888": { + "op": "intc_1 // 0", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#2" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "889": { + "op": "frame_bury 4", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#2" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ] + }, + "891": { + "block": "dynamic_array_concat_dynamic_element_for_header@5", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig 4", + "defined_out": [ + "head_offset#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "893": { + "op": "frame_dig 2", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset_adjustment#0" + ] + }, + "895": { + "op": "<", + "defined_out": [ + "continue_looping%1#0", + "head_offset#0", + "item_offset_adjustment#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "continue_looping%1#0" + ] + }, + "896": { + "op": "bz dynamic_array_concat_dynamic_element_after_for@8", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ] + }, + "899": { + "op": "frame_dig -1", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "new_head_and_tail#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "new_head_and_tail#0 (copy)" + ] + }, + "901": { + "op": "frame_dig 4", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "new_head_and_tail#0 (copy)", + "head_offset#0" + ] + }, + "903": { + "op": "dup", + "defined_out": [ + "head_offset#0", + "head_offset#0 (copy)", + "item_offset_adjustment#0", + "new_head_and_tail#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "new_head_and_tail#0 (copy)", + "head_offset#0 (copy)", + "head_offset#0 (copy)" + ] + }, + "904": { + "op": "cover 2", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head_and_tail#0 (copy)", + "head_offset#0 (copy)" + ] + }, + "906": { + "op": "extract_uint16", + "defined_out": [ + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0" + ] + }, + "907": { + "op": "frame_dig 0", + "defined_out": [ + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "item_offset#0", + "item_offset_adjustment#2" + ] + }, + "909": { + "op": "+", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "tmp%5#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%5#0" + ] + }, + "910": { + "op": "itob", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "tmp%6#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%6#0" + ] + }, + "911": { + "op": "extract 6 2", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "tmp%7#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%7#0" + ] + }, + "914": { + "op": "frame_dig 1", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "tmp%7#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "tmp%7#0", + "new_head#0" + ] + }, + "916": { + "op": "swap", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0", + "tmp%7#0" + ] + }, + "917": { + "op": "concat", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "new_head#0" + ] + }, + "918": { + "op": "frame_bury 1", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "920": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0", + "2" + ] + }, + "921": { + "op": "+", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "head_offset#0" + ] + }, + "922": { + "op": "frame_bury 4", + "defined_out": [ + "head_offset#0", + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ] + }, + "924": { + "op": "b dynamic_array_concat_dynamic_element_for_header@5" + }, + "927": { + "block": "dynamic_array_concat_dynamic_element_after_for@8", + "stack_in": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0" + ], + "op": "frame_dig -4", + "defined_out": [ + "array_items_count#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_items_count#0 (copy)" + ] + }, + "929": { + "op": "frame_dig -2", + "defined_out": [ + "array_items_count#0 (copy)", + "new_items_count#0 (copy)" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "array_items_count#0 (copy)", + "new_items_count#0 (copy)" + ] + }, + "931": { + "op": "+", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%8#0" + ] + }, + "932": { + "op": "itob", + "defined_out": [ + "tmp%9#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%9#0" + ] + }, + "933": { + "op": "extract 6 2", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%10#0" + ] + }, + "936": { + "op": "frame_dig 1", + "defined_out": [ + "new_head#0", + "tmp%10#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%10#0", + "new_head#0" + ] + }, + "938": { + "op": "concat", + "defined_out": [ + "new_head#0", + "tmp%11#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0" + ] + }, + "939": { + "op": "frame_dig -3", + "defined_out": [ + "array_head_and_tail#0 (copy)", + "new_head#0", + "tmp%11#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "array_head_and_tail#0 (copy)" + ] + }, + "941": { + "op": "frame_dig 3", + "defined_out": [ + "array_head_and_tail#0 (copy)", + "new_head#0", + "tmp%0#0", + "tmp%11#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "array_head_and_tail#0 (copy)", + "tmp%0#0" + ] + }, + "943": { + "op": "frame_dig 0", + "defined_out": [ + "array_head_and_tail#0 (copy)", + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%11#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "array_head_and_tail#0 (copy)", + "tmp%0#0", + "item_offset_adjustment#2" + ] + }, + "945": { + "op": "substring3", + "defined_out": [ + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%11#0", + "tmp%14#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%11#0", + "tmp%14#0" + ] + }, + "946": { + "op": "concat", + "defined_out": [ + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%15#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0" + ] + }, + "947": { + "op": "frame_dig -1", + "defined_out": [ + "item_offset_adjustment#2", + "new_head#0", + "new_head_and_tail#0 (copy)", + "tmp%0#0", + "tmp%15#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "new_head_and_tail#0 (copy)" + ] + }, + "949": { + "op": "len", + "defined_out": [ + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%15#0", + "tmp%17#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%17#0" + ] + }, + "950": { + "op": "frame_dig -1", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%17#0", + "new_head_and_tail#0 (copy)" + ] + }, + "952": { + "op": "frame_dig 2", + "defined_out": [ + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "new_head_and_tail#0 (copy)", + "tmp%0#0", + "tmp%15#0", + "tmp%17#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%17#0", + "new_head_and_tail#0 (copy)", + "item_offset_adjustment#0" + ] + }, + "954": { + "op": "uncover 2", + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "new_head_and_tail#0 (copy)", + "item_offset_adjustment#0", + "tmp%17#0" + ] + }, + "956": { + "op": "substring3", + "defined_out": [ + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%15#0", + "tmp%18#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%15#0", + "tmp%18#0" + ] + }, + "957": { + "op": "concat", + "defined_out": [ + "item_offset_adjustment#0", + "item_offset_adjustment#2", + "new_head#0", + "tmp%0#0", + "tmp%19#0" + ], + "stack_out": [ + "item_offset_adjustment#2", + "new_head#0", + "item_offset_adjustment#0", + "tmp%0#0", + "head_offset#0", + "tmp%19#0" + ] + }, + "958": { + "op": "frame_bury 0" + }, + "960": { + "retsub": true, + "op": "retsub" + }, + "961": { + "subroutine": "smart_contracts.asset_labeling.contract.b2str", + "params": { + "b#0": "bytes" + }, + "block": "b2str", + "stack_in": [], + "op": "proto 1 1" + }, + "964": { + "op": "frame_dig -1", + "defined_out": [ + "b#0 (copy)" + ], + "stack_out": [ + "b#0 (copy)" + ] + }, + "966": { + "op": "len", + "defined_out": [ + "length%0#0" + ], + "stack_out": [ + "length%0#0" + ] + }, + "967": { + "op": "itob", + "defined_out": [ + "as_bytes%0#0" + ], + "stack_out": [ + "as_bytes%0#0" + ] + }, + "968": { + "op": "extract 6 2", + "defined_out": [ + "length_uint16%0#0" + ], + "stack_out": [ + "length_uint16%0#0" + ] + }, + "971": { + "op": "frame_dig -1", + "stack_out": [ + "length_uint16%0#0", + "b#0 (copy)" + ] + }, + "973": { + "op": "concat", + "defined_out": [ + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0" + ] + }, + "974": { + "retsub": true, + "op": "retsub" + }, + "975": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "params": {}, + "block": "admin_only", + "stack_in": [], + "op": "txn Sender", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "977": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "978": { + "op": "bytec 4 // \"admin\"", + "defined_out": [ + "\"admin\"", + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0", + "\"admin\"" + ] + }, + "980": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "981": { + "error": "check self.admin exists", + "op": "assert // check self.admin exists", + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0" + ] + }, + "982": { + "op": "==", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "cond#0" + ] + }, + "983": { + "op": "bnz admin_only_after_if_else@3", + "stack_out": [] + }, + "986": { + "op": "bytec 7 // \"ERR:UNAUTH\"", + "defined_out": [ + "\"ERR:UNAUTH\"" + ], + "stack_out": [ + "\"ERR:UNAUTH\"" + ] + }, + "988": { + "op": "log", + "stack_out": [] + }, + "989": { + "op": "err" + }, + "990": { + "block": "admin_only_after_if_else@3", + "stack_in": [], + "retsub": true, + "op": "retsub" + }, + "991": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", + "params": { + "new_admin#0": "bytes" + }, + "block": "change_admin", + "stack_in": [], + "op": "proto 1 0" + }, + "994": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" + }, + "997": { + "op": "bytec 4 // \"admin\"", + "defined_out": [ + "\"admin\"" + ], + "stack_out": [ + "\"admin\"" + ] + }, + "999": { + "op": "frame_dig -1", + "defined_out": [ + "\"admin\"", + "new_admin#0 (copy)" + ], + "stack_out": [ + "\"admin\"", + "new_admin#0 (copy)" + ] + }, + "1001": { + "op": "app_global_put", + "stack_out": [] + }, + "1002": { + "retsub": true, + "op": "retsub" + }, + "1003": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", + "params": { + "id#0": "bytes", + "name#0": "bytes" + }, + "block": "add_label", + "stack_in": [], + "op": "proto 2 0" + }, + "1006": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" + }, + "1009": { + "op": "frame_dig -2", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1011": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1012": { + "op": "bury 1", + "stack_out": [ + "maybe_exists%0#0" + ] + }, + "1014": { + "op": "bz add_label_after_if_else@3", + "stack_out": [] + }, + "1017": { + "op": "bytec 5 // \"ERR:EXISTS\"", + "defined_out": [ + "\"ERR:EXISTS\"" + ], + "stack_out": [ + "\"ERR:EXISTS\"" + ] + }, + "1019": { + "op": "log", + "stack_out": [] + }, + "1020": { + "op": "err" + }, + "1021": { + "block": "add_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1023": { + "op": "len", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "1024": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "2" + ] + }, + "1025": { + "op": "==", + "defined_out": [ + "cond#1" + ], + "stack_out": [ + "cond#1" + ] + }, + "1026": { + "op": "bnz add_label_after_if_else@7", + "stack_out": [] + }, + "1029": { + "op": "bytec 8 // \"ERR:LENGTH\"", + "defined_out": [ + "\"ERR:LENGTH\"" + ], + "stack_out": [ + "\"ERR:LENGTH\"" + ] + }, + "1031": { + "op": "log", + "stack_out": [] + }, + "1032": { + "op": "err" + }, + "1033": { + "block": "add_label_after_if_else@7", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "name#0 (copy)" + ], + "stack_out": [ + "name#0 (copy)" + ] + }, + "1035": { + "op": "len", + "defined_out": [ + "length%0#0" + ], + "stack_out": [ + "length%0#0" + ] + }, + "1036": { + "op": "itob", + "defined_out": [ + "as_bytes%0#0" + ], + "stack_out": [ + "as_bytes%0#0" + ] + }, + "1037": { + "op": "extract 6 2", + "defined_out": [ + "length_uint16%0#0" + ], + "stack_out": [ + "length_uint16%0#0" + ] + }, + "1040": { + "op": "frame_dig -1", + "stack_out": [ + "length_uint16%0#0", + "name#0 (copy)" + ] + }, + "1042": { + "op": "concat", + "defined_out": [ + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0" + ] + }, + "1043": { + "op": "pushbytes 0x001200000000000000000000000000000000", + "defined_out": [ + "0x001200000000000000000000000000000000", + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "0x001200000000000000000000000000000000" + ] + }, + "1063": { + "op": "swap", + "stack_out": [ + "0x001200000000000000000000000000000000", + "encoded_value%0#0" + ] + }, + "1064": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%4#0" + ], + "stack_out": [ + "encoded_tuple_buffer%4#0" + ] + }, + "1065": { + "op": "frame_dig -2", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "id#0 (copy)" + ], + "stack_out": [ + "encoded_tuple_buffer%4#0", + "id#0 (copy)" + ] + }, + "1067": { + "op": "box_del", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "{box_del}" + ], + "stack_out": [ + "encoded_tuple_buffer%4#0", + "{box_del}" + ] + }, + "1068": { + "op": "pop", + "stack_out": [ + "encoded_tuple_buffer%4#0" + ] + }, + "1069": { + "op": "frame_dig -2", + "stack_out": [ + "encoded_tuple_buffer%4#0", + "id#0 (copy)" + ] + }, + "1071": { + "op": "swap", + "stack_out": [ + "id#0 (copy)", + "encoded_tuple_buffer%4#0" + ] + }, + "1072": { + "op": "box_put", + "stack_out": [] + }, + "1073": { + "retsub": true, + "op": "retsub" + }, + "1074": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", + "params": { + "id#0": "bytes" + }, + "block": "remove_label", + "stack_in": [], + "op": "proto 1 0" + }, + "1077": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" + }, + "1080": { + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1082": { + "op": "box_len", + "defined_out": [ + "cond#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "cond#0" + ] + }, + "1083": { + "op": "bury 1", + "stack_out": [ + "cond#0" + ] + }, + "1085": { + "op": "bnz remove_label_after_if_else@3", + "stack_out": [] + }, + "1088": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "\"ERR:NOEXIST\"" + ] + }, + "1089": { + "op": "log", + "stack_out": [] + }, + "1090": { + "op": "err" + }, + "1091": { + "block": "remove_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1093": { + "op": "len", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "1094": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0", + "2" + ] + }, + "1095": { + "op": "==", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "cond#0" + ] + }, + "1096": { + "op": "bnz remove_label_after_if_else@7", + "stack_out": [] + }, + "1099": { + "op": "bytec 8 // \"ERR:LENGTH\"", + "defined_out": [ + "\"ERR:LENGTH\"" + ], + "stack_out": [ + "\"ERR:LENGTH\"" + ] + }, + "1101": { + "op": "log", + "stack_out": [] + }, + "1102": { + "op": "err" + }, + "1103": { + "block": "remove_label_after_if_else@7", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1105": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1106": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "1107": { + "error": "Index access is out of bounds", + "op": "extract 2 8 // on error: Index access is out of bounds", + "defined_out": [ + "reinterpret_biguint%0#0" + ], + "stack_out": [ + "reinterpret_biguint%0#0" + ] + }, + "1110": { + "op": "bytec 9 // 0x0000000000000000", + "defined_out": [ + "0x0000000000000000", + "reinterpret_biguint%0#0" + ], + "stack_out": [ + "reinterpret_biguint%0#0", + "0x0000000000000000" + ] + }, + "1112": { + "op": "b==", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "cond#0" + ] + }, + "1113": { + "op": "bnz remove_label_after_if_else@11", + "stack_out": [] + }, + "1116": { + "op": "bytec 10 // \"ERR:NOEMPTY\"", + "defined_out": [ + "\"ERR:NOEMPTY\"" + ], + "stack_out": [ + "\"ERR:NOEMPTY\"" + ] + }, + "1118": { + "op": "log", + "stack_out": [] + }, + "1119": { + "op": "err" + }, + "1120": { + "block": "remove_label_after_if_else@11", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1122": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "{box_del}" + ] + }, + "1123": { + "op": "pop", + "stack_out": [] + }, + "1124": { + "retsub": true, + "op": "retsub" + }, + "1125": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", + "params": { + "id#0": "bytes" + }, + "block": "get_label", + "stack_in": [], + "op": "proto 1 1" + }, + "1128": { + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1130": { + "op": "box_len", + "defined_out": [ + "cond#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "cond#0" + ] + }, + "1131": { + "op": "bury 1", + "stack_out": [ + "cond#0" + ] + }, + "1133": { + "op": "bnz get_label_after_if_else@3", + "stack_out": [] + }, + "1136": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "\"ERR:NOEXIST\"" + ] + }, + "1137": { + "op": "log", + "stack_out": [] + }, + "1138": { + "op": "err" + }, + "1139": { + "block": "get_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "id#0 (copy)" + ], + "stack_out": [ + "id#0 (copy)" + ] + }, + "1141": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1142": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "1143": { + "retsub": true, + "op": "retsub" + }, + "1144": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", + "params": { + "ids#0": "bytes" + }, + "block": "log_labels", + "stack_in": [], + "op": "proto 1 0" + }, + "1147": { + "op": "frame_dig -1", + "defined_out": [ + "ids#0 (copy)" + ], + "stack_out": [ + "ids#0 (copy)" + ] + }, + "1149": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "ids#0 (copy)" + ], + "stack_out": [ + "ids#0 (copy)", + "0" + ] + }, + "1150": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "1151": { + "op": "intc_1 // 0", + "defined_out": [ + "_idx#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0" + ] + }, + "1152": { + "block": "log_labels_for_header@1", + "stack_in": [ + "array_length%0#0", + "_idx#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_idx#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0" + ] + }, + "1154": { + "op": "frame_dig 0", + "defined_out": [ + "_idx#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_length%0#0" + ] + }, + "1156": { + "op": "<", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "continue_looping%0#0" + ] + }, + "1157": { + "op": "bz log_labels_after_for@4", + "stack_out": [ + "array_length%0#0", + "_idx#0" + ] + }, + "1160": { + "op": "frame_dig -1", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "ids#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "ids#0 (copy)" + ] + }, + "1162": { + "op": "extract 2 0", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "array_head_and_tail%0#0" + ] + }, + "1165": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0" + ] + }, + "1167": { + "op": "dup", + "defined_out": [ + "_idx#0", + "_idx#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)", + "_idx#0 (copy)" + ] + }, + "1168": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)" + ] + }, + "1170": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "_idx#0", + "_idx#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "_idx#0 (copy)", + "2" + ] + }, + "1171": { + "op": "*", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0" + ] + }, + "1172": { + "op": "dig 1", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "item_offset_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1174": { + "op": "swap", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" + ] + }, + "1175": { + "op": "extract_uint16", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "1176": { + "op": "dup2", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "item_offset%0#0", + "item_offset%0#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" + ] + }, + "1177": { + "op": "extract_uint16", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" + ] + }, + "1178": { + "op": "intc_2 // 2", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" + ] + }, + "1179": { + "op": "+", + "defined_out": [ + "_idx#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_head_tail_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" + ] + }, + "1180": { + "op": "extract3", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "label_id#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "label_id#0" + ] + }, + "1181": { + "op": "extract 2 0", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "tmp%0#0" + ] + }, + "1184": { + "op": "box_get", + "defined_out": [ + "_idx#0", + "array_length%0#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1185": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "maybe_value%0#0" + ] + }, + "1186": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0" + ] + }, + "1187": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_idx#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0", + "1" + ] + }, + "1188": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_idx#0", + "_idx#0" + ] + }, + "1189": { + "op": "frame_bury 1", + "defined_out": [ + "_idx#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_idx#0" + ] + }, + "1191": { + "op": "b log_labels_for_header@1" + }, + "1194": { + "block": "log_labels_after_for@4", + "stack_in": [ + "array_length%0#0", + "_idx#0" + ], + "retsub": true, + "op": "retsub" + }, + "1195": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", + "params": { + "label#0": "bytes" + }, + "block": "admin_or_operator_only", + "stack_in": [], + "op": "proto 1 0" + }, + "1198": { + "op": "txn Sender", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "1200": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "1201": { + "op": "bytec 4 // \"admin\"", + "defined_out": [ + "\"admin\"", + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0", + "\"admin\"" + ] + }, + "1203": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1204": { + "error": "check self.admin exists", + "op": "assert // check self.admin exists", + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0" + ] + }, + "1205": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "1206": { + "op": "bz admin_or_operator_only_after_if_else@2", + "stack_out": [] + }, + "1209": { + "retsub": true, + "op": "retsub" + }, + "1210": { + "block": "admin_or_operator_only_after_if_else@2", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "label#0 (copy)" + ] + }, + "1212": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "op": "callsub operator_only", + "stack_out": [] + }, + "1215": { + "retsub": true, + "op": "retsub" + }, + "1216": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "params": { + "label#0": "bytes" + }, + "block": "operator_only", + "stack_in": [], + "op": "proto 1 0" + }, + "1219": { + "op": "txn Sender", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "1221": { + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "label#0 (copy)" + ] + }, + "1223": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "op": "callsub get_operator_label_index", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "1226": { + "op": "intc 5 // 4294967296", + "defined_out": [ + "4294967296", + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0", + "4294967296" + ] + }, + "1228": { + "op": "!=", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "1229": { + "op": "bz operator_only_bool_false@3", + "stack_out": [] + }, + "1232": { + "op": "txn Sender", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "1234": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%3#0", + "label#0 (copy)" + ] + }, + "1236": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "op": "callsub get_operator_label_index", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "1239": { + "op": "intc 4 // 4294967295", + "defined_out": [ + "4294967295", + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0", + "4294967295" + ] + }, + "1241": { + "op": "!=", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "1242": { + "op": "bz operator_only_bool_false@3", + "stack_out": [] + }, + "1245": { + "op": "intc_0 // 1", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "cond#0" + ] + }, + "1246": { + "block": "operator_only_bool_merge@4", + "stack_in": [ + "cond#0" + ], + "op": "bnz operator_only_after_if_else@7", + "defined_out": [], + "stack_out": [] + }, + "1249": { + "op": "bytec 7 // \"ERR:UNAUTH\"", + "defined_out": [ + "\"ERR:UNAUTH\"" + ], + "stack_out": [ + "\"ERR:UNAUTH\"" + ] + }, + "1251": { + "op": "log", + "stack_out": [] + }, + "1252": { + "op": "err" + }, + "1253": { + "block": "operator_only_after_if_else@7", + "stack_in": [], + "retsub": true, + "op": "retsub" + }, + "1254": { + "block": "operator_only_bool_false@3", + "stack_in": [], + "op": "intc_1 // 0", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "cond#0" + ] + }, + "1255": { + "op": "b operator_only_bool_merge@4" + }, + "1258": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "params": { + "operator#0": "bytes", + "label#0": "bytes" + }, + "block": "get_operator_label_index", + "stack_in": [], + "op": "proto 2 1" + }, + "1261": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "1262": { + "op": "bytec_3 // \"\"", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0" + ] + }, + "1263": { + "op": "dup", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1264": { + "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "operator#0 (copy)" + ] + }, + "1266": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1267": { + "op": "bury 1", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%0#0" + ] + }, + "1269": { + "op": "bnz get_operator_label_index_after_if_else@2", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1272": { + "op": "intc 5 // 4294967296", + "defined_out": [ + "4294967296" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "4294967296" + ] + }, + "1274": { + "op": "frame_bury 0" + }, + "1276": { + "retsub": true, + "op": "retsub" + }, + "1277": { + "block": "get_operator_label_index_after_if_else@2", + "stack_in": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "operator#0 (copy)" + ] + }, + "1279": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1280": { + "op": "swap", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%1#0", + "maybe_value%1#0" + ] + }, + "1281": { + "op": "dup", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "maybe_value%1#0 (copy)" + ] + }, + "1282": { + "op": "cover 2", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0", + "maybe_value%1#0" + ] + }, + "1284": { + "op": "frame_bury 0", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1286": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" + ] + }, + "1287": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "0" + ] + }, + "1288": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_length%0#0" + ] + }, + "1289": { + "op": "frame_bury 1", + "defined_out": [ + "array_length%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1291": { + "op": "intc_1 // 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1292": { + "op": "frame_bury 2", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1294": { + "block": "get_operator_label_index_for_header@3", + "stack_in": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 2", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1296": { + "op": "frame_dig 1", + "defined_out": [ + "array_length%0#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0", + "array_length%0#0" + ] + }, + "1298": { + "op": "<", + "defined_out": [ + "array_length%0#0", + "continue_looping%0#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "continue_looping%0#0" + ] + }, + "1299": { + "op": "bz get_operator_label_index_after_for@8", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1302": { + "op": "frame_dig 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" + ] + }, + "1304": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0" + ] + }, + "1307": { + "op": "frame_dig 2", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0" + ] + }, + "1309": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0", + "2" + ] + }, + "1310": { + "op": "*", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0" + ] + }, + "1311": { + "op": "dig 1", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1313": { + "op": "swap", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" + ] + }, + "1314": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "1315": { + "op": "dup2", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" + ] + }, + "1316": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_length%0#0", + "item_offset%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" + ] + }, + "1317": { + "op": "intc_2 // 2", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" + ] + }, + "1318": { + "op": "+", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" + ] + }, + "1319": { + "op": "extract3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "stored_label#0" + ] + }, + "1320": { + "op": "extract 2 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "tmp%2#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "tmp%2#0" + ] + }, + "1323": { + "op": "frame_dig -1", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label#0 (copy)", + "maybe_value%1#0", + "tmp%2#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "tmp%2#0", + "label#0 (copy)" + ] + }, + "1325": { + "op": "==", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "tmp%3#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "tmp%3#0" + ] + }, + "1326": { + "op": "bz get_operator_label_index_after_if_else@6", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1329": { + "op": "frame_dig 2", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1331": { + "op": "frame_bury 0" + }, + "1333": { + "retsub": true, + "op": "retsub" + }, + "1334": { + "block": "get_operator_label_index_after_if_else@6", + "stack_in": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 2", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1336": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "idx#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0", + "1" + ] + }, + "1337": { + "op": "+", + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1338": { + "op": "frame_bury 2", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1340": { + "op": "b get_operator_label_index_for_header@3" + }, + "1343": { + "block": "get_operator_label_index_after_for@8", + "stack_in": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "intc 4 // 4294967295", + "defined_out": [ + "4294967295" + ], + "stack_out": [ + "maybe_value%1#0", + "array_length%0#0", + "idx#0", + "4294967295" + ] + }, + "1345": { + "op": "frame_bury 0" + }, + "1347": { + "retsub": true, + "op": "retsub" + }, + "1348": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", + "params": { + "operator#0": "bytes", + "label#0": "bytes" + }, + "block": "add_operator_to_label", + "stack_in": [], + "op": "proto 2 0" + }, + "1351": { + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "label#0 (copy)" + ] + }, + "1353": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", + "op": "callsub admin_or_operator_only", + "stack_out": [] + }, + "1356": { + "op": "frame_dig -1", + "stack_out": [ + "label#0 (copy)" + ] + }, + "1358": { + "op": "box_len", + "defined_out": [ + "cond#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "cond#0" + ] + }, + "1359": { + "op": "bury 1", + "stack_out": [ + "cond#0" + ] + }, + "1361": { + "op": "bnz add_operator_to_label_after_if_else@10", + "stack_out": [] + }, + "1364": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "\"ERR:NOEXIST\"" + ] + }, + "1365": { + "op": "log", + "stack_out": [] + }, + "1366": { + "op": "err" + }, + "1367": { + "block": "add_operator_to_label_after_if_else@10", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "operator#0 (copy)" + ] + }, + "1369": { + "op": "box_len", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1370": { + "op": "bury 1", + "stack_out": [ + "maybe_exists%1#0" + ] + }, + "1372": { + "op": "bz add_operator_to_label_else_body@2", + "stack_out": [] + }, + "1375": { + "op": "frame_dig -2", + "stack_out": [ + "operator#0 (copy)" + ] + }, + "1377": { + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)", + "operator#0 (copy)" + ], + "stack_out": [ + "operator#0 (copy)", + "label#0 (copy)" + ] + }, + "1379": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "op": "callsub get_operator_label_index", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "1382": { + "op": "intc 4 // 4294967295", + "defined_out": [ + "4294967295", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "4294967295" + ] + }, + "1384": { + "op": "==", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "cond#0" + ] + }, + "1385": { + "op": "bnz add_operator_to_label_after_if_else@6", + "stack_out": [] + }, + "1388": { + "op": "bytec 5 // \"ERR:EXISTS\"", + "defined_out": [ + "\"ERR:EXISTS\"" + ], + "stack_out": [ + "\"ERR:EXISTS\"" + ] + }, + "1390": { + "op": "log", + "stack_out": [] + }, + "1391": { + "op": "err" + }, + "1392": { + "block": "add_operator_to_label_after_if_else@6", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "operator#0 (copy)" + ] + }, + "1394": { + "op": "box_get", + "defined_out": [ + "existing#0", + "maybe_exists%2#0" + ], + "stack_out": [ + "existing#0", + "maybe_exists%2#0" + ] + }, + "1395": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", + "stack_out": [ + "existing#0" + ] + }, + "1396": { + "op": "frame_dig -1", + "defined_out": [ + "existing#0", + "label#0 (copy)" + ], + "stack_out": [ + "existing#0", + "label#0 (copy)" + ] + }, + "1398": { + "op": "len", + "defined_out": [ + "existing#0", + "length%0#0" + ], + "stack_out": [ + "existing#0", + "length%0#0" + ] + }, + "1399": { + "op": "itob", + "defined_out": [ + "as_bytes%0#0", + "existing#0" + ], + "stack_out": [ + "existing#0", + "as_bytes%0#0" + ] + }, + "1400": { + "op": "extract 6 2", + "defined_out": [ + "existing#0", + "length_uint16%0#0" + ], + "stack_out": [ + "existing#0", + "length_uint16%0#0" + ] + }, + "1403": { + "op": "frame_dig -1", + "stack_out": [ + "existing#0", + "length_uint16%0#0", + "label#0 (copy)" + ] + }, + "1405": { + "op": "concat", + "defined_out": [ + "encoded_value%0#0", + "existing#0" + ], + "stack_out": [ + "existing#0", + "encoded_value%0#0" + ] + }, + "1406": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "encoded_value%0#0", + "existing#0" + ], + "stack_out": [ + "existing#0", + "encoded_value%0#0", + "1" + ] + }, + "1407": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", + "stack_out": [ + "existing#0" + ] + }, + "1410": { + "op": "frame_dig -2", + "stack_out": [ + "existing#0", + "operator#0 (copy)" + ] + }, + "1412": { + "op": "box_del", + "defined_out": [ + "existing#0", + "{box_del}" + ], + "stack_out": [ + "existing#0", + "{box_del}" + ] + }, + "1413": { + "op": "pop", + "stack_out": [ + "existing#0" + ] + }, + "1414": { + "op": "frame_dig -2", + "stack_out": [ + "existing#0", + "operator#0 (copy)" + ] + }, + "1416": { + "op": "swap", + "stack_out": [ + "operator#0 (copy)", + "existing#0" + ] + }, + "1417": { + "op": "box_put", + "stack_out": [] + }, + "1418": { + "block": "add_operator_to_label_after_if_else@3", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "label#0 (copy)" + ] + }, + "1420": { + "op": "box_get", + "defined_out": [ + "label_descriptor#0", + "maybe_exists%3#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_exists%3#0" + ] + }, + "1421": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "label_descriptor#0" + ] + }, + "1422": { + "op": "dup", + "defined_out": [ + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "label_descriptor#0 (copy)" + ] + }, + "1423": { + "op": "pushint 10 // 10", + "defined_out": [ + "10", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "label_descriptor#0 (copy)", + "10" + ] + }, + "1425": { + "op": "extract_uint64", + "defined_out": [ + "label_descriptor#0", + "tmp%9#0" + ], + "stack_out": [ + "label_descriptor#0", + "tmp%9#0" + ] + }, + "1426": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "label_descriptor#0", + "tmp%9#0" + ], + "stack_out": [ + "label_descriptor#0", + "tmp%9#0", + "1" + ] + }, + "1427": { + "op": "+", + "defined_out": [ + "label_descriptor#0", + "to_encode%0#0" + ], + "stack_out": [ + "label_descriptor#0", + "to_encode%0#0" + ] + }, + "1428": { + "op": "itob", + "defined_out": [ + "label_descriptor#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "label_descriptor#0", + "val_as_bytes%0#0" + ] + }, + "1429": { + "op": "replace2 10", + "stack_out": [ + "label_descriptor#0" + ] + }, + "1431": { + "op": "frame_dig -1", + "stack_out": [ + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1433": { + "op": "box_del", + "defined_out": [ + "label_descriptor#0", + "{box_del}" + ], + "stack_out": [ + "label_descriptor#0", + "{box_del}" + ] + }, + "1434": { + "op": "pop", + "stack_out": [ + "label_descriptor#0" + ] + }, + "1435": { + "op": "frame_dig -1", + "stack_out": [ + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1437": { + "op": "swap", + "stack_out": [ + "label#0 (copy)", + "label_descriptor#0" + ] + }, + "1438": { + "op": "box_put", + "stack_out": [] + }, + "1439": { + "retsub": true, + "op": "retsub" + }, + "1440": { + "block": "add_operator_to_label_else_body@2", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "label#0 (copy)" + ] + }, + "1442": { + "op": "len", + "defined_out": [ + "length%1#0" + ], + "stack_out": [ + "length%1#0" + ] + }, + "1443": { + "op": "itob", + "defined_out": [ + "as_bytes%1#0" + ], + "stack_out": [ + "as_bytes%1#0" + ] + }, + "1444": { + "op": "extract 6 2", + "defined_out": [ + "length_uint16%1#0" + ], + "stack_out": [ + "length_uint16%1#0" + ] + }, + "1447": { + "op": "frame_dig -1", + "stack_out": [ + "length_uint16%1#0", + "label#0 (copy)" + ] + }, + "1449": { + "op": "concat", + "defined_out": [ + "encoded_value%1#0" + ], + "stack_out": [ + "encoded_value%1#0" + ] + }, + "1450": { + "op": "bytec 6 // 0x0002", + "defined_out": [ + "0x0002", + "encoded_value%1#0" + ], + "stack_out": [ + "encoded_value%1#0", + "0x0002" + ] + }, + "1452": { + "op": "swap", + "stack_out": [ + "0x0002", + "encoded_value%1#0" + ] + }, + "1453": { + "op": "concat", + "defined_out": [ + "result%1#0" + ], + "stack_out": [ + "result%1#0" + ] + }, + "1454": { + "op": "bytec 11 // 0x0001", + "defined_out": [ + "0x0001", + "result%1#0" + ], + "stack_out": [ + "result%1#0", + "0x0001" + ] + }, + "1456": { + "op": "swap", + "stack_out": [ + "0x0001", + "result%1#0" + ] + }, + "1457": { + "op": "concat", + "defined_out": [ + "array_data%0#0" + ], + "stack_out": [ + "array_data%0#0" + ] + }, + "1458": { + "op": "frame_dig -2", + "defined_out": [ + "array_data%0#0", + "operator#0 (copy)" + ], + "stack_out": [ + "array_data%0#0", + "operator#0 (copy)" + ] + }, + "1460": { + "op": "box_del", + "defined_out": [ + "array_data%0#0", + "{box_del}" + ], + "stack_out": [ + "array_data%0#0", + "{box_del}" + ] + }, + "1461": { + "op": "pop", + "stack_out": [ + "array_data%0#0" + ] + }, + "1462": { + "op": "frame_dig -2", + "stack_out": [ + "array_data%0#0", + "operator#0 (copy)" + ] + }, + "1464": { + "op": "swap", + "stack_out": [ + "operator#0 (copy)", + "array_data%0#0" + ] + }, + "1465": { + "op": "box_put", + "stack_out": [] + }, + "1466": { + "op": "b add_operator_to_label_after_if_else@3" + }, + "1469": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", + "params": { + "operator#0": "bytes", + "label#0": "bytes" + }, + "block": "remove_operator_from_label", + "stack_in": [], + "op": "proto 2 0" + }, + "1472": { + "op": "intc_1 // 0", + "stack_out": [ + "label_descriptor#0" + ] + }, + "1473": { + "op": "dupn 4", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0" + ] + }, + "1475": { + "op": "bytec_3 // \"\"", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0" + ] + }, + "1476": { + "op": "dupn 2", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1478": { + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label#0 (copy)" + ] + }, + "1480": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", + "op": "callsub admin_or_operator_only", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1483": { + "op": "frame_dig -1", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label#0 (copy)" + ] + }, + "1485": { + "op": "box_len", + "defined_out": [ + "cond#0", + "maybe_value%0#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%0#0", + "cond#0" + ] + }, + "1486": { + "op": "bury 1", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ] + }, + "1488": { + "op": "bnz remove_operator_from_label_after_if_else@28", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1491": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "\"ERR:NOEXIST\"" + ] + }, + "1492": { + "op": "log", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1493": { + "op": "err" + }, + "1494": { + "block": "remove_operator_from_label_after_if_else@28", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1496": { + "op": "box_len", + "defined_out": [ + "cond#0", + "maybe_value%1#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%1#0", + "cond#0" + ] + }, + "1497": { + "op": "bury 1", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ] + }, + "1499": { + "op": "bnz remove_operator_from_label_after_if_else@32", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1502": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "\"ERR:NOEXIST\"" + ] + }, + "1503": { + "op": "log", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1504": { + "op": "err" + }, + "1505": { + "block": "remove_operator_from_label_after_if_else@32", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1507": { + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)", + "operator#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)", + "label#0 (copy)" + ] + }, + "1509": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", + "op": "callsub get_operator_label_index", + "defined_out": [ + "label_idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_idx#0" + ] + }, + "1512": { + "op": "dup", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_idx#0", + "label_idx#0" + ] + }, + "1513": { + "op": "frame_bury 7", + "defined_out": [ + "label_idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_idx#0" + ] + }, + "1515": { + "op": "intc 4 // 4294967295", + "defined_out": [ + "4294967295", + "label_idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_idx#0", + "4294967295" + ] + }, + "1517": { + "op": "!=", + "defined_out": [ + "label_idx#0", + "tmp%2#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%2#0" + ] + }, + "1518": { + "op": "bz remove_operator_from_label_bool_false@3", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1521": { + "op": "frame_dig 7", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_idx#0" + ] + }, + "1523": { + "op": "intc 5 // 4294967296", + "defined_out": [ + "4294967296", + "label_idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_idx#0", + "4294967296" + ] + }, + "1525": { + "op": "!=", + "defined_out": [ + "label_idx#0", + "tmp%3#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%3#0" + ] + }, + "1526": { + "op": "bz remove_operator_from_label_bool_false@3", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1529": { + "op": "intc_0 // 1", + "defined_out": [ + "cond#0", + "label_idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ] + }, + "1530": { + "block": "remove_operator_from_label_bool_merge@4", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ], + "op": "bnz remove_operator_from_label_after_if_else@24", + "defined_out": [], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1533": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "\"ERR:NOEXIST\"" + ] + }, + "1534": { + "op": "log", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1535": { + "op": "err" + }, + "1536": { + "block": "remove_operator_from_label_after_if_else@24", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label#0 (copy)" + ] + }, + "1538": { + "op": "box_get", + "defined_out": [ + "label_descriptor#0", + "maybe_exists%2#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "maybe_exists%2#0" + ] + }, + "1539": { + "op": "swap", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_exists%2#0", + "label_descriptor#0" + ] + }, + "1540": { + "op": "dup", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_exists%2#0", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ] + }, + "1541": { + "op": "cover 2", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "maybe_exists%2#0", + "label_descriptor#0" + ] + }, + "1543": { + "op": "frame_bury 0", + "defined_out": [ + "label_descriptor#0", + "maybe_exists%2#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "maybe_exists%2#0" + ] + }, + "1545": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0" + ] + }, + "1546": { + "error": "Index access is out of bounds", + "op": "extract 10 8 // on error: Index access is out of bounds", + "defined_out": [ + "label_descriptor#0", + "reinterpret_biguint%0#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "reinterpret_biguint%0#0" + ] + }, + "1549": { + "op": "pushbytes 0x0000000000000001", + "defined_out": [ + "0x0000000000000001", + "label_descriptor#0", + "reinterpret_biguint%0#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "reinterpret_biguint%0#0", + "0x0000000000000001" + ] + }, + "1559": { + "op": "b>", + "defined_out": [ + "label_descriptor#0", + "tmp%5#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%5#0" + ] + }, + "1560": { + "op": "bnz remove_operator_from_label_bool_true@6", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1563": { + "op": "frame_dig 0", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0" + ] + }, + "1565": { + "error": "Index access is out of bounds", + "op": "extract 2 8 // on error: Index access is out of bounds", + "defined_out": [ + "label_descriptor#0", + "reinterpret_biguint%2#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "reinterpret_biguint%2#0" + ] + }, + "1568": { + "op": "bytec 9 // 0x0000000000000000", + "defined_out": [ + "0x0000000000000000", + "label_descriptor#0", + "reinterpret_biguint%2#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "reinterpret_biguint%2#0", + "0x0000000000000000" + ] + }, + "1570": { + "op": "b==", + "defined_out": [ + "label_descriptor#0", + "tmp%6#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%6#0" + ] + }, + "1571": { + "op": "bz remove_operator_from_label_bool_false@7", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1574": { + "block": "remove_operator_from_label_bool_true@6", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "intc_0 // 1", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ] + }, + "1575": { + "block": "remove_operator_from_label_bool_merge@8", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ], + "op": "bnz remove_operator_from_label_after_if_else@20", + "defined_out": [], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1578": { + "op": "bytec 10 // \"ERR:NOEMPTY\"", + "defined_out": [ + "\"ERR:NOEMPTY\"" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "\"ERR:NOEMPTY\"" + ] + }, + "1580": { + "op": "log", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1581": { + "op": "err" + }, + "1582": { + "block": "remove_operator_from_label_after_if_else@20", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig 0", + "defined_out": [ + "label_descriptor#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0" + ] + }, + "1584": { + "op": "dup", + "defined_out": [ + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ] + }, + "1585": { + "op": "pushint 10 // 10", + "defined_out": [ + "10", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)", + "10" + ] + }, + "1587": { + "op": "extract_uint64", + "defined_out": [ + "label_descriptor#0", + "tmp%8#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "tmp%8#0" + ] + }, + "1588": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "label_descriptor#0", + "tmp%8#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "tmp%8#0", + "1" + ] + }, + "1589": { + "op": "-", + "defined_out": [ + "label_descriptor#0", + "to_encode%0#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "to_encode%0#0" + ] + }, + "1590": { + "op": "itob", + "defined_out": [ + "label_descriptor#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "val_as_bytes%0#0" + ] + }, + "1591": { + "op": "replace2 10", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0" + ] + }, + "1593": { + "op": "frame_dig -1", + "defined_out": [ + "label#0 (copy)", + "label_descriptor#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1595": { + "op": "box_del", + "defined_out": [ + "label_descriptor#0", + "{box_del}" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "{box_del}" + ] + }, + "1596": { + "op": "pop", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0" + ] + }, + "1597": { + "op": "frame_dig -1", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1599": { + "op": "swap", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "label#0 (copy)", + "label_descriptor#0" + ] + }, + "1600": { + "op": "box_put", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1601": { + "op": "frame_dig -2", + "defined_out": [ + "label_descriptor#0", + "operator#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1603": { + "op": "box_get", + "defined_out": [ + "label_descriptor#0", + "maybe_exists%3#0", + "maybe_value%3#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "1604": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%3#0" + ] + }, + "1605": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "label_descriptor#0", + "maybe_value%3#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%3#0", + "0" + ] + }, + "1606": { + "op": "extract_uint16", + "defined_out": [ + "label_descriptor#0", + "tmp%11#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%11#0" + ] + }, + "1607": { + "op": "intc_0 // 1", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%11#0", + "1" + ] + }, + "1608": { + "op": "==", + "defined_out": [ + "label_descriptor#0", + "tmp%12#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%12#0" + ] + }, + "1609": { + "op": "bz remove_operator_from_label_else_body@10", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1612": { + "op": "frame_dig -2", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1614": { + "op": "box_del", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "{box_del}" + ] + }, + "1615": { + "op": "pop", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1616": { + "retsub": true, + "op": "retsub" + }, + "1617": { + "block": "remove_operator_from_label_else_body@10", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "next_list#0" + ] + }, + "1618": { + "op": "frame_bury 2", + "defined_out": [ + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1620": { + "op": "frame_dig -2", + "defined_out": [ + "next_list#0", + "operator#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1622": { + "op": "box_get", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "1623": { + "op": "swap", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_exists%4#0", + "maybe_value%4#0" + ] + }, + "1624": { + "op": "dup", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_exists%4#0", + "maybe_value%4#0", + "maybe_value%4#0 (copy)" + ] + }, + "1625": { + "op": "cover 2", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "maybe_exists%4#0", + "maybe_value%4#0" + ] + }, + "1627": { + "op": "frame_bury 1", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "1629": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0" + ] + }, + "1630": { + "op": "intc_1 // 0", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "0" + ] + }, + "1631": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0", + "maybe_value%4#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "array_length%0#0" + ] + }, + "1632": { + "op": "frame_bury 5", + "defined_out": [ + "array_length%0#0", + "maybe_value%4#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1634": { + "op": "intc_1 // 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0" + ] + }, + "1635": { + "op": "frame_bury 6", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1637": { + "block": "remove_operator_from_label_for_header@11", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig 6", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0" + ] + }, + "1639": { + "op": "frame_dig 5", + "defined_out": [ + "array_length%0#0", + "idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_length%0#0" + ] + }, + "1641": { + "op": "<", + "defined_out": [ + "array_length%0#0", + "continue_looping%0#0", + "idx#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "continue_looping%0#0" + ] + }, + "1642": { + "op": "bz remove_operator_from_label_after_for@16", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1645": { + "op": "frame_dig 1", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0" + ] + }, + "1647": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "array_head_and_tail%0#0" + ] + }, + "1650": { + "op": "frame_dig 6", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "array_head_and_tail%0#0", + "idx#0" + ] + }, + "1652": { + "op": "dup", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "idx#0 (copy)", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "array_head_and_tail%0#0", + "idx#0 (copy)", + "idx#0 (copy)" + ] + }, + "1653": { + "op": "cover 2", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0 (copy)" + ] + }, + "1655": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "idx#0 (copy)", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0 (copy)", + "2" + ] + }, + "1656": { + "op": "*", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0" + ] + }, + "1657": { + "op": "dig 1", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1659": { + "op": "swap", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" + ] + }, + "1660": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "1661": { + "op": "dup2", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" + ] + }, + "1662": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_length%0#0", + "item_offset%0#0", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" + ] + }, + "1663": { + "op": "intc_2 // 2", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" + ] + }, + "1664": { + "op": "+", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "maybe_value%4#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" + ] + }, + "1665": { + "op": "extract3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "stored_label#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "stored_label#0" + ] + }, + "1666": { + "op": "frame_bury 4", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%4#0", + "stored_label#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0" + ] + }, + "1668": { + "op": "frame_dig 7", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "stored_label#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "label_idx#0" + ] + }, + "1670": { + "op": "!=", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "stored_label#0", + "tmp%15#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%15#0" + ] + }, + "1671": { + "op": "frame_dig 2", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#9", + "stored_label#0", + "tmp%15#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%15#0", + "next_list#9" + ] + }, + "1673": { + "op": "frame_bury 3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#9", + "stored_label#0", + "tmp%15#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "tmp%15#0" + ] + }, + "1675": { + "op": "bz remove_operator_from_label_after_if_else@14", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1678": { + "op": "frame_dig 2", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "next_list#0" + ] + }, + "1680": { + "op": "frame_dig 4", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "next_list#0", + "stored_label#0" + ] + }, + "1682": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "array_length%0#0", + "idx#0", + "label_idx#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "next_list#0", + "stored_label#0", + "1" + ] + }, + "1683": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "next_list#9" + ] + }, + "1686": { + "op": "frame_bury 3", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1688": { + "block": "remove_operator_from_label_after_if_else@14", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "next_list#0" + ] + }, + "1690": { + "op": "frame_bury 2", + "defined_out": [ + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1692": { + "op": "frame_dig 6", + "defined_out": [ + "idx#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0" + ] + }, + "1694": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "idx#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0", + "1" + ] + }, + "1695": { + "op": "+", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "idx#0" + ] + }, + "1696": { + "op": "frame_bury 6", + "defined_out": [ + "idx#0", + "next_list#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1698": { + "op": "b remove_operator_from_label_for_header@11" + }, + "1701": { + "block": "remove_operator_from_label_after_for@16", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1703": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "{box_del}" + ] + }, + "1704": { + "op": "pop", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1705": { + "op": "frame_dig -2", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)" + ] + }, + "1707": { + "op": "frame_dig 2", + "defined_out": [ + "next_list#0", + "operator#0 (copy)" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "operator#0 (copy)", + "next_list#0" + ] + }, + "1709": { + "op": "box_put", + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ] + }, + "1710": { + "retsub": true, + "op": "retsub" + }, + "1711": { + "block": "remove_operator_from_label_bool_false@7", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "intc_1 // 0", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ] + }, + "1712": { + "op": "b remove_operator_from_label_bool_merge@8" + }, + "1715": { + "block": "remove_operator_from_label_bool_false@3", + "stack_in": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0" + ], + "op": "intc_1 // 0", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "label_descriptor#0", + "maybe_value%4#0", + "next_list#0", + "next_list#9", + "stored_label#0", + "array_length%0#0", + "idx#0", + "label_idx#0", + "cond#0" + ] + }, + "1716": { + "op": "b remove_operator_from_label_bool_merge@4" + }, + "1719": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", + "params": { + "operator#0": "bytes" + }, + "block": "get_operator_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "1722": { + "op": "frame_dig -1", + "defined_out": [ + "operator#0 (copy)" + ], + "stack_out": [ + "operator#0 (copy)" + ] + }, + "1724": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1725": { + "op": "bury 1", + "stack_out": [ + "maybe_exists%0#0" + ] + }, + "1727": { + "op": "bz get_operator_labels_after_if_else@2", + "stack_out": [] + }, + "1730": { + "op": "frame_dig -1", + "stack_out": [ + "operator#0 (copy)" + ] + }, + "1732": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1733": { + "error": "check self.operators entry exists", + "op": "assert // check self.operators entry exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "1734": { + "retsub": true, + "op": "retsub" + }, + "1735": { + "block": "get_operator_labels_after_if_else@2", + "stack_in": [], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "0x0000" + ], + "stack_out": [ + "0x0000" + ] + }, + "1736": { + "retsub": true, + "op": "retsub" + }, + "1737": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", + "params": { + "label#0": "bytes", + "asset#0": "uint64" + }, + "block": "add_label_to_asset", + "stack_in": [], + "op": "proto 2 0" + }, + "1740": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%1#1" + ] + }, + "1741": { + "op": "dup", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0" + ] + }, + "1742": { + "op": "bytec_3 // \"\"", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0" + ] + }, + "1743": { + "op": "dup", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1744": { + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label#0 (copy)" + ] + }, + "1746": { + "op": "box_len", + "defined_out": [ + "cond#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%0#0", + "cond#0" + ] + }, + "1747": { + "op": "bury 1", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "cond#0" + ] + }, + "1749": { + "op": "bnz add_label_to_asset_after_if_else@19", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1752": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "\"ERR:NOEXIST\"" + ] + }, + "1753": { + "op": "log", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1754": { + "op": "err" + }, + "1755": { + "block": "add_label_to_asset_after_if_else@19", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label#0 (copy)" + ] + }, + "1757": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "op": "callsub operator_only", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1760": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "asset#0 (copy)" + ] + }, + "1762": { + "op": "itob", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0" + ] + }, + "1763": { + "op": "dup", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "tmp%1#0" + ] + }, + "1764": { + "op": "frame_bury 1", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0" + ] + }, + "1766": { + "op": "box_len", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1767": { + "op": "bury 1", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%1#0" + ] + }, + "1769": { + "op": "bz add_label_to_asset_else_body@2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1772": { + "op": "frame_dig 1", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0" + ] + }, + "1774": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#1", + "maybe_value%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%0#0", + "maybe_exists%0#1" + ] + }, + "1775": { + "op": "bury 1", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%0#1" + ] + }, + "1777": { + "op": "bnz add_label_to_asset_after_if_else@6", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1780": { + "op": "intc 5 // 4294967296", + "defined_out": [ + "tmp%1#0", + "tmp%3#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%3#0" + ] + }, + "1782": { + "block": "add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%3#0" + ], + "op": "intc 4 // 4294967295", + "defined_out": [ + "4294967295", + "tmp%3#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%3#0", + "4294967295" + ] + }, + "1784": { + "op": "==", + "defined_out": [ + "cond#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "cond#0" + ] + }, + "1785": { + "op": "bnz add_label_to_asset_after_if_else@15", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1788": { + "op": "bytec 5 // \"ERR:EXISTS\"", + "defined_out": [ + "\"ERR:EXISTS\"" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "\"ERR:EXISTS\"" + ] + }, + "1790": { + "op": "log", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1791": { + "op": "err" + }, + "1792": { + "block": "add_label_to_asset_after_if_else@15", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0" + ] + }, + "1794": { + "op": "dup", + "defined_out": [ + "tmp%1#0", + "tmp%1#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ] + }, + "1795": { + "op": "box_get", + "defined_out": [ + "existing#0", + "maybe_exists%2#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "maybe_exists%2#0" + ] + }, + "1796": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0" + ] + }, + "1797": { + "op": "frame_dig -2", + "defined_out": [ + "existing#0", + "label#0 (copy)", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "label#0 (copy)" + ] + }, + "1799": { + "op": "len", + "defined_out": [ + "existing#0", + "length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "length%0#0" + ] + }, + "1800": { + "op": "itob", + "defined_out": [ + "as_bytes%0#0", + "existing#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "as_bytes%0#0" + ] + }, + "1801": { + "op": "extract 6 2", + "defined_out": [ + "existing#0", + "length_uint16%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "length_uint16%0#0" + ] + }, + "1804": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "length_uint16%0#0", + "label#0 (copy)" + ] + }, + "1806": { + "op": "concat", + "defined_out": [ + "encoded_value%0#0", + "existing#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "encoded_value%0#0" + ] + }, + "1807": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "encoded_value%0#0", + "existing#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "encoded_value%0#0", + "1" + ] + }, + "1808": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0" + ] + }, + "1811": { + "op": "dig 1", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "tmp%1#0 (copy)" + ] + }, + "1813": { + "op": "box_del", + "defined_out": [ + "existing#0", + "tmp%1#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0", + "{box_del}" + ] + }, + "1814": { + "op": "pop", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "existing#0" + ] + }, + "1815": { + "op": "box_put", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1816": { + "block": "add_label_to_asset_after_if_else@3", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label#0 (copy)" + ] + }, + "1818": { + "op": "box_get", + "defined_out": [ + "label_descriptor#0", + "maybe_exists%3#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "maybe_exists%3#0" + ] + }, + "1819": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0" + ] + }, + "1820": { + "op": "dup", + "defined_out": [ + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ] + }, + "1821": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)", + "2" + ] + }, + "1822": { + "op": "extract_uint64", + "defined_out": [ + "label_descriptor#0", + "tmp%13#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "tmp%13#0" + ] + }, + "1823": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "label_descriptor#0", + "tmp%13#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "tmp%13#0", + "1" + ] + }, + "1824": { + "op": "+", + "defined_out": [ + "label_descriptor#0", + "to_encode%0#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "to_encode%0#0" + ] + }, + "1825": { + "op": "itob", + "defined_out": [ + "label_descriptor#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "val_as_bytes%0#0" + ] + }, + "1826": { + "op": "replace2 2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0" + ] + }, + "1828": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1830": { + "op": "box_del", + "defined_out": [ + "label_descriptor#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "{box_del}" + ] + }, + "1831": { + "op": "pop", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0" + ] + }, + "1832": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "1834": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label#0 (copy)", + "label_descriptor#0" + ] + }, + "1835": { + "op": "box_put", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1836": { + "retsub": true, + "op": "retsub" + }, + "1837": { + "block": "add_label_to_asset_after_if_else@6", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0" + ] + }, + "1839": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#1", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "maybe_exists%1#0" + ] + }, + "1840": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%1#0", + "maybe_value%1#1" + ] + }, + "1841": { + "op": "dup", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_exists%1#0", + "maybe_value%1#1", + "maybe_value%1#1 (copy)" + ] + }, + "1842": { + "op": "cover 2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "maybe_exists%1#0", + "maybe_value%1#1" + ] + }, + "1844": { + "op": "frame_bury 0", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#1", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "maybe_exists%1#0" + ] + }, + "1846": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1" + ] + }, + "1847": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "maybe_value%1#1", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "0" + ] + }, + "1848": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0", + "maybe_value%1#1", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_length%0#0" + ] + }, + "1849": { + "op": "frame_bury 2", + "defined_out": [ + "array_length%0#0", + "maybe_value%1#1", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1851": { + "op": "intc_1 // 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1852": { + "op": "frame_bury 3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1854": { + "block": "add_label_to_asset_for_header@7", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1856": { + "op": "frame_dig 2", + "defined_out": [ + "array_length%0#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "idx#0", + "array_length%0#0" + ] + }, + "1858": { + "op": "<", + "defined_out": [ + "array_length%0#0", + "continue_looping%0#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "continue_looping%0#0" + ] + }, + "1859": { + "op": "bz add_label_to_asset_after_for@11", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1862": { + "op": "frame_dig 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1" + ] + }, + "1864": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0" + ] + }, + "1867": { + "op": "frame_dig 3", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0" + ] + }, + "1869": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "idx#0", + "2" + ] + }, + "1870": { + "op": "*", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0" + ] + }, + "1871": { + "op": "dig 1", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset_offset%0#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset_offset%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1873": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset_offset%0#0" + ] + }, + "1874": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "1875": { + "op": "dup2", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "array_length%0#0", + "idx#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" + ] + }, + "1876": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_length%0#0", + "item_offset%0#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" + ] + }, + "1877": { + "op": "intc_2 // 2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" + ] + }, + "1878": { + "op": "+", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "idx#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "maybe_value%1#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" + ] + }, + "1879": { + "op": "extract3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "stored_label#0" + ] + }, + "1880": { + "op": "extract 2 0", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%4#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%4#1" + ] + }, + "1883": { + "op": "frame_dig -2", + "defined_out": [ + "array_length%0#0", + "idx#0", + "label#0 (copy)", + "maybe_value%1#1", + "tmp%4#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%4#1", + "label#0 (copy)" + ] + }, + "1885": { + "op": "==", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%5#1" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%5#1" + ] + }, + "1886": { + "op": "bz add_label_to_asset_after_if_else@10", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1889": { + "op": "frame_dig 3", + "defined_out": [ + "array_length%0#0", + "idx#0", + "maybe_value%1#1", + "tmp%3#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%3#0" + ] + }, + "1891": { + "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" + }, + "1894": { + "block": "add_label_to_asset_after_if_else@10", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1896": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "idx#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "idx#0", + "1" + ] + }, + "1897": { + "op": "+", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "idx#0" + ] + }, + "1898": { + "op": "frame_bury 3", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1900": { + "op": "b add_label_to_asset_for_header@7" + }, + "1903": { + "block": "add_label_to_asset_after_for@11", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "intc 4 // 4294967295", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%3#0" + ] + }, + "1905": { + "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" + }, + "1908": { + "block": "add_label_to_asset_else_body@2", + "stack_in": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "label#0 (copy)" + ] + }, + "1910": { + "op": "len", + "defined_out": [ + "length%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "length%1#0" + ] + }, + "1911": { + "op": "itob", + "defined_out": [ + "as_bytes%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "as_bytes%1#0" + ] + }, + "1912": { + "op": "extract 6 2", + "defined_out": [ + "length_uint16%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "length_uint16%1#0" + ] + }, + "1915": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "length_uint16%1#0", + "label#0 (copy)" + ] + }, + "1917": { + "op": "concat", + "defined_out": [ + "encoded_value%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "encoded_value%1#0" + ] + }, + "1918": { + "op": "bytec 6 // 0x0002", + "defined_out": [ + "0x0002", + "encoded_value%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "encoded_value%1#0", + "0x0002" + ] + }, + "1920": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "0x0002", + "encoded_value%1#0" + ] + }, + "1921": { + "op": "concat", + "defined_out": [ + "result%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "result%1#0" + ] + }, + "1922": { + "op": "bytec 11 // 0x0001", + "defined_out": [ + "0x0001", + "result%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "result%1#0", + "0x0001" + ] + }, + "1924": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "0x0001", + "result%1#0" + ] + }, + "1925": { + "op": "concat", + "defined_out": [ + "array_data%0#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0" + ] + }, + "1926": { + "op": "frame_dig 1", + "defined_out": [ + "array_data%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0" + ] + }, + "1928": { + "op": "dup", + "defined_out": [ + "array_data%0#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ] + }, + "1929": { + "op": "box_del", + "defined_out": [ + "array_data%0#0", + "tmp%1#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0", + "{box_del}" + ] + }, + "1930": { + "op": "pop", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "array_data%0#0", + "tmp%1#0" + ] + }, + "1931": { + "op": "swap", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0", + "tmp%1#0", + "array_data%0#0" + ] + }, + "1932": { + "op": "box_put", + "stack_out": [ + "maybe_value%1#1", + "tmp%1#0", + "array_length%0#0", + "idx#0" + ] + }, + "1933": { + "op": "b add_label_to_asset_after_if_else@3" + }, + "1936": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", + "params": { + "label#0": "bytes", + "asset#0": "uint64" + }, + "block": "remove_label_from_asset", + "stack_in": [], + "op": "proto 2 0" + }, + "1939": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%3#0" + ] + }, + "1940": { + "op": "dupn 3", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0" + ] + }, + "1942": { + "op": "bytec_3 // \"\"", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0" + ] + }, + "1943": { + "op": "dupn 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1945": { + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label#0 (copy)" + ] + }, + "1947": { + "op": "box_len", + "defined_out": [ + "cond#1", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%0#0", + "cond#1" + ] + }, + "1948": { + "op": "bury 1", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "cond#1" + ] + }, + "1950": { + "op": "bnz remove_label_from_asset_after_if_else@20", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1953": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "\"ERR:NOEXIST\"" + ] + }, + "1954": { + "op": "log", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1955": { + "op": "err" + }, + "1956": { + "block": "remove_label_from_asset_after_if_else@20", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label#0 (copy)" + ] + }, + "1958": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", + "op": "callsub operator_only", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1961": { + "op": "intc_1 // 0", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "found#0" + ] + }, + "1962": { + "op": "frame_bury 5", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1964": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)", + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "asset#0 (copy)" + ] + }, + "1966": { + "op": "itob", + "defined_out": [ + "found#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "1967": { + "op": "dup", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0", + "tmp%1#0" + ] + }, + "1968": { + "op": "frame_bury 3", + "defined_out": [ + "found#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "1970": { + "op": "box_get", + "defined_out": [ + "found#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1971": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%1#0" + ] + }, + "1972": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%1#0", + "0" + ] + }, + "1973": { + "op": "extract_uint16", + "defined_out": [ + "found#0", + "tmp%1#0", + "tmp%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%3#0" + ] + }, + "1974": { + "op": "intc_0 // 1", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%3#0", + "1" + ] + }, + "1975": { + "op": "==", + "defined_out": [ + "found#0", + "tmp%1#0", + "tmp%4#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%4#0" + ] + }, + "1976": { + "op": "bz remove_label_from_asset_else_body@5", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "1979": { + "op": "frame_dig 3", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "1981": { + "op": "box_get", + "defined_out": [ + "found#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "1982": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%2#0" + ] + }, + "1983": { + "op": "dup", + "defined_out": [ + "found#0", + "maybe_value%2#0", + "maybe_value%2#0 (copy)", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%2#0", + "maybe_value%2#0 (copy)" + ] + }, + "1984": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0", + "found#0", + "maybe_value%2#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%2#0", + "array_head_and_tail%0#0" + ] + }, + "1987": { + "op": "swap", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "maybe_value%2#0" + ] + }, + "1988": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "maybe_value%2#0", + "0" + ] + }, + "1989": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "array_length%0#0", + "found#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ] + }, + "1990": { + "error": "Index access is out of bounds", + "op": "assert // Index access is out of bounds", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0" + ] + }, + "1991": { + "op": "dup", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "found#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1992": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "0" + ] + }, + "1993": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "found#0", + "item_offset%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "1994": { + "op": "dup2", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "found#0", + "item_offset%0#0", + "item_offset%0#0 (copy)", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%0#0 (copy)" + ] + }, + "1995": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "found#0", + "item_length%0#0", + "item_offset%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0" + ] + }, + "1996": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_head_and_tail%0#0", + "found#0", + "item_length%0#0", + "item_offset%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_length%0#0", + "2" + ] + }, + "1997": { + "op": "+", + "defined_out": [ + "array_head_and_tail%0#0", + "found#0", + "item_head_tail_length%0#0", + "item_offset%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%0#0", + "item_offset%0#0", + "item_head_tail_length%0#0" + ] + }, + "1998": { + "op": "extract3", + "defined_out": [ + "found#0", + "tmp%1#0", + "tmp%7#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%7#0" + ] + }, + "1999": { + "op": "extract 2 0", + "defined_out": [ + "found#0", + "tmp%1#0", + "tmp%8#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%8#0" + ] + }, + "2002": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%8#0", + "label#0 (copy)" + ] + }, + "2004": { + "op": "==", + "defined_out": [ + "found#0", + "tmp%1#0", + "tmp%9#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%9#0" + ] + }, + "2005": { + "op": "bz remove_label_from_asset_else_body@3", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2008": { + "op": "frame_dig 3", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "2010": { + "op": "box_del", + "defined_out": [ + "found#0", + "tmp%1#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "{box_del}" + ] + }, + "2011": { + "op": "pop", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2012": { + "op": "intc_0 // 1", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "found#0" + ] + }, + "2013": { + "op": "frame_bury 5", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2015": { + "block": "remove_label_from_asset_after_if_else@13", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig 5", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "found#0" + ] + }, + "2017": { + "op": "bnz remove_label_from_asset_after_if_else@16", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2020": { + "op": "bytec_1 // \"ERR:NOEXIST\"", + "defined_out": [ + "\"ERR:NOEXIST\"", + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "\"ERR:NOEXIST\"" + ] + }, + "2021": { + "op": "log", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2022": { + "op": "err" + }, + "2023": { + "block": "remove_label_from_asset_after_if_else@16", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "label#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label#0 (copy)" + ] + }, + "2025": { + "op": "box_get", + "defined_out": [ + "label_descriptor#0", + "maybe_exists%4#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "maybe_exists%4#0" + ] + }, + "2026": { + "error": "check self.labels entry exists", + "op": "assert // check self.labels entry exists", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0" + ] + }, + "2027": { + "op": "dup", + "defined_out": [ + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ] + }, + "2028": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "label_descriptor#0", + "label_descriptor#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "label_descriptor#0 (copy)", + "2" + ] + }, + "2029": { + "op": "extract_uint64", + "defined_out": [ + "label_descriptor#0", + "tmp%20#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "tmp%20#0" + ] + }, + "2030": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "label_descriptor#0", + "tmp%20#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "tmp%20#0", + "1" + ] + }, + "2031": { + "op": "-", + "defined_out": [ + "label_descriptor#0", + "to_encode%0#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "to_encode%0#0" + ] + }, + "2032": { + "op": "itob", + "defined_out": [ + "label_descriptor#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "val_as_bytes%0#0" + ] + }, + "2033": { + "op": "replace2 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0" + ] + }, + "2035": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "2037": { + "op": "box_del", + "defined_out": [ + "label_descriptor#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "{box_del}" + ] + }, + "2038": { + "op": "pop", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0" + ] + }, + "2039": { + "op": "frame_dig -2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label_descriptor#0", + "label#0 (copy)" + ] + }, + "2041": { + "op": "swap", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "label#0 (copy)", + "label_descriptor#0" + ] + }, + "2042": { + "op": "box_put", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2043": { + "retsub": true, + "op": "retsub" + }, + "2044": { + "block": "remove_label_from_asset_else_body@3", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "intc_1 // 0", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "found#0" + ] + }, + "2045": { + "op": "frame_bury 5", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2047": { + "op": "b remove_label_from_asset_after_if_else@13" + }, + "2050": { + "block": "remove_label_from_asset_else_body@5", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "next_list#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0" + ] + }, + "2051": { + "op": "frame_bury 1", + "defined_out": [ + "next_list#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2053": { + "op": "frame_dig 3", + "defined_out": [ + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "2055": { + "op": "box_get", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2056": { + "op": "swap", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_exists%3#0", + "maybe_value%3#0" + ] + }, + "2057": { + "op": "dup", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "maybe_value%3#0 (copy)" + ] + }, + "2058": { + "op": "cover 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0", + "maybe_exists%3#0", + "maybe_value%3#0" + ] + }, + "2060": { + "op": "frame_bury 0", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2062": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0" + ] + }, + "2063": { + "op": "intc_1 // 0", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0", + "0" + ] + }, + "2064": { + "op": "extract_uint16", + "defined_out": [ + "array_length%1#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_length%1#0" + ] + }, + "2065": { + "op": "frame_bury 4", + "defined_out": [ + "array_length%1#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2067": { + "op": "intc_1 // 0", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "2068": { + "op": "frame_bury 6", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2070": { + "block": "remove_label_from_asset_for_header@6", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig 6", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "2072": { + "op": "frame_dig 4", + "defined_out": [ + "array_length%1#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0", + "array_length%1#0" + ] + }, + "2074": { + "op": "<", + "defined_out": [ + "array_length%1#0", + "continue_looping%0#0", + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "continue_looping%0#0" + ] + }, + "2075": { + "op": "bz remove_label_from_asset_after_for@12", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2078": { + "op": "frame_dig 0", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "maybe_value%3#0" + ] + }, + "2080": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0" + ] + }, + "2083": { + "op": "frame_dig 6", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "idx#0" + ] + }, + "2085": { + "op": "intc_2 // 2", + "defined_out": [ + "2", + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "idx#0", + "2" + ] + }, + "2086": { + "op": "*", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_offset_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset_offset%1#0" + ] + }, + "2087": { + "op": "dig 1", + "defined_out": [ + "array_head_and_tail%1#0", + "array_head_and_tail%1#0 (copy)", + "array_length%1#0", + "idx#0", + "item_offset_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset_offset%1#0", + "array_head_and_tail%1#0 (copy)" + ] + }, + "2089": { + "op": "swap", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "array_head_and_tail%1#0 (copy)", + "item_offset_offset%1#0" + ] + }, + "2090": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0" + ] + }, + "2091": { + "op": "dup2", + "defined_out": [ + "array_head_and_tail%1#0", + "array_head_and_tail%1#0 (copy)", + "array_length%1#0", + "idx#0", + "item_offset%1#0", + "item_offset%1#0 (copy)", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "array_head_and_tail%1#0 (copy)", + "item_offset%1#0 (copy)" + ] + }, + "2092": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_length%1#0", + "item_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "item_length%1#0" + ] + }, + "2093": { + "op": "intc_2 // 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "item_length%1#0", + "2" + ] + }, + "2094": { + "op": "+", + "defined_out": [ + "array_head_and_tail%1#0", + "array_length%1#0", + "idx#0", + "item_head_tail_length%1#0", + "item_offset%1#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "array_head_and_tail%1#0", + "item_offset%1#0", + "item_head_tail_length%1#0" + ] + }, + "2095": { + "op": "extract3", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "stored_label#0" + ] + }, + "2096": { + "op": "dup", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "stored_label#0", + "stored_label#0" + ] + }, + "2097": { + "op": "frame_bury 2", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "stored_label#0" + ] + }, + "2099": { + "op": "extract 2 0", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0", + "tmp%14#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%14#0" + ] + }, + "2102": { + "op": "frame_dig -2", + "defined_out": [ + "array_length%1#0", + "idx#0", + "label#0 (copy)", + "maybe_value%3#0", + "stored_label#0", + "tmp%14#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%14#0", + "label#0 (copy)" + ] + }, + "2104": { + "op": "!=", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "stored_label#0", + "tmp%15#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%15#0" + ] + }, + "2105": { + "op": "bz remove_label_from_asset_else_body@9", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2108": { + "op": "frame_dig 1", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0" + ] + }, + "2110": { + "op": "frame_dig 2", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0", + "stored_label#0" + ] + }, + "2112": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0", + "stored_label#0", + "1" + ] + }, + "2113": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", + "op": "callsub dynamic_array_concat_byte_length_head", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "next_list#0" + ] + }, + "2116": { + "op": "frame_bury 1", + "defined_out": [ + "array_length%1#0", + "idx#0", + "maybe_value%3#0", + "next_list#0", + "stored_label#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2118": { + "block": "remove_label_from_asset_after_if_else@10", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig 6", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "2120": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0", + "1" + ] + }, + "2121": { + "op": "+", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "idx#0" + ] + }, + "2122": { + "op": "frame_bury 6", + "defined_out": [ + "idx#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2124": { + "op": "b remove_label_from_asset_for_header@6" + }, + "2127": { + "block": "remove_label_from_asset_else_body@9", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "intc_0 // 1", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "found#0" + ] + }, + "2128": { + "op": "frame_bury 5", + "defined_out": [ + "found#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2130": { + "op": "b remove_label_from_asset_after_if_else@10" + }, + "2133": { + "block": "remove_label_from_asset_after_for@12", + "stack_in": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "2135": { + "op": "dup", + "defined_out": [ + "tmp%1#0", + "tmp%1#0 (copy)" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ] + }, + "2136": { + "op": "box_del", + "defined_out": [ + "tmp%1#0", + "{box_del}" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0", + "{box_del}" + ] + }, + "2137": { + "op": "pop", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0" + ] + }, + "2138": { + "op": "frame_dig 1", + "defined_out": [ + "next_list#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0", + "tmp%1#0", + "next_list#0" + ] + }, + "2140": { + "op": "box_put", + "stack_out": [ + "maybe_value%3#0", + "next_list#0", + "stored_label#0", + "tmp%1#0", + "array_length%1#0", + "found#0", + "idx#0" + ] + }, + "2141": { + "op": "b remove_label_from_asset_after_if_else@13" + }, + "2144": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "2147": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "2149": { + "op": "itob", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2150": { + "op": "dup", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0" + ] + }, + "2151": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2152": { + "op": "bury 1", + "stack_out": [ + "tmp%0#0", + "maybe_exists%0#0" + ] + }, + "2154": { + "op": "bz get_asset_labels_after_if_else@2", + "stack_out": [ + "tmp%0#0" + ] + }, + "2157": { + "op": "frame_dig 0", + "stack_out": [ + "tmp%0#0", + "tmp%0#0" + ] + }, + "2159": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2160": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "tmp%0#0", + "maybe_value%1#0" + ] + }, + "2161": { + "op": "swap" + }, + "2162": { + "retsub": true, + "op": "retsub" + }, + "2163": { + "block": "get_asset_labels_after_if_else@2", + "stack_in": [ + "tmp%0#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "0x0000" + ], + "stack_out": [ + "tmp%0#0", + "0x0000" + ] + }, + "2164": { + "op": "swap" + }, + "2165": { + "retsub": true, + "op": "retsub" + }, + "2166": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "2169": { + "op": "intc_1 // 0", + "stack_out": [ + "tmp%0#0" + ] + }, + "2170": { + "op": "bytec_2 // 0x0000" + }, + "2171": { + "op": "frame_dig -1" + }, + "2173": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "assets#0 (copy)", + "0" + ] + }, + "2174": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0" + ] + }, + "2175": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "2176": { + "block": "get_assets_labels_for_header@1", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2178": { + "op": "frame_dig 2", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "2180": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "2181": { + "op": "bz get_assets_labels_after_for@7", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "2184": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "2186": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "2189": { + "op": "frame_dig 3", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "2191": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0", + "8" + ] + }, + "2192": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "2193": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "asset#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "asset#0" + ] + }, + "2194": { + "op": "itob", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0" + ] + }, + "2195": { + "op": "dup", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0", + "tmp%0#0" + ] + }, + "2196": { + "op": "frame_bury 0", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0" + ] + }, + "2198": { + "op": "box_len", + "defined_out": [ + "_i#0", + "array_length%0#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2199": { + "op": "bury 1", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_exists%0#0" + ] + }, + "2201": { + "op": "bz get_assets_labels_else_body@4", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "2204": { + "op": "frame_dig 0", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "tmp%0#0" + ] + }, + "2206": { + "op": "box_get", + "defined_out": [ + "_i#0", + "array_length%0#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2207": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%1#0" + ] + }, + "2208": { + "op": "bytec 6 // 0x0002", + "defined_out": [ + "0x0002", + "_i#0", + "array_length%0#0", + "maybe_value%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "maybe_value%1#0", + "0x0002" + ] + }, + "2210": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "0x0002", + "maybe_value%1#0" + ] + }, + "2211": { + "op": "concat", + "defined_out": [ + "_i#0", + "array_length%0#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0" + ] + }, + "2212": { + "op": "frame_dig 1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "out#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0" + ] + }, + "2214": { + "op": "dup", + "defined_out": [ + "_i#0", + "array_length%0#0", + "out#0", + "out#0 (copy)", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0", + "out#0 (copy)" + ] + }, + "2215": { + "op": "intc_1 // 0", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0", + "out#0 (copy)", + "0" + ] + }, + "2216": { + "op": "extract_uint16", + "defined_out": [ + "_i#0", + "array_length%0#0", + "l_count%0#0", + "out#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "out#0", + "l_count%0#0" + ] + }, + "2217": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "l_count%0#0", + "out#0" + ] + }, + "2218": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_length%0#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "out#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "l_count%0#0", + "l_head_and_tail%0#0" + ] + }, + "2221": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "out#0", + "result%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "result%1#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "1" + ] + }, + "2222": { + "op": "uncover 3", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%0#0", + "l_head_and_tail%0#0", + "1", + "result%1#0" + ] + }, + "2224": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", + "op": "callsub dynamic_array_concat_dynamic_element", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0" + ] + }, + "2227": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "out#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "2229": { + "block": "get_assets_labels_after_if_else@5", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2231": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "2232": { + "op": "+", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2233": { + "op": "frame_bury 3", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "2235": { + "op": "b get_assets_labels_for_header@1" + }, + "2238": { + "block": "get_assets_labels_else_body@4", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0" + ] + }, + "2240": { + "op": "dup", + "defined_out": [ + "out#0", + "out#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0", + "out#0 (copy)" + ] + }, + "2241": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "out#0", + "out#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0", + "out#0 (copy)", + "0" + ] + }, + "2242": { + "op": "extract_uint16", + "defined_out": [ + "l_count%1#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0", + "l_count%1#0" + ] + }, + "2243": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "out#0" + ] + }, + "2244": { + "op": "extract 2 0", + "defined_out": [ + "l_count%1#0", + "l_head_and_tail%1#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "l_head_and_tail%1#0" + ] + }, + "2247": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "l_count%1#0", + "l_head_and_tail%1#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "l_head_and_tail%1#0", + "1" + ] + }, + "2248": { + "op": "pushbytes 0x00020000", + "defined_out": [ + "0x00020000", + "1", + "l_count%1#0", + "l_head_and_tail%1#0", + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "l_count%1#0", + "l_head_and_tail%1#0", + "1", + "0x00020000" + ] + }, + "2254": { + "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", + "op": "callsub dynamic_array_concat_dynamic_element", + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0" + ] + }, + "2257": { + "op": "frame_bury 1", + "defined_out": [ + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ] + }, + "2259": { + "op": "b get_assets_labels_after_if_else@5" + }, + "2262": { + "block": "get_assets_labels_after_for@7", + "stack_in": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "out#0" + ], + "stack_out": [ + "tmp%0#0", + "out#0", + "array_length%0#0", + "_i#0", + "out#0" + ] + }, + "2264": { + "op": "frame_bury 0" + }, + "2266": { + "retsub": true, + "op": "retsub" + }, + "2267": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", + "params": { + "asset_id#0": "uint64" + }, + "block": "_get_asset_micro", + "stack_in": [], + "op": "proto 1 1" + }, + "2270": { + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "asset_id#0 (copy)" + ] + }, + "2272": { + "op": "asset_params_get AssetUnitName", + "defined_out": [ + "check%0#0", + "value%0#0" + ], + "stack_out": [ + "value%0#0", + "check%0#0" + ] + }, + "2274": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "value%0#0" + ] + }, + "2275": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2278": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "asset_id#0 (copy)" + ] + }, + "2280": { + "op": "asset_params_get AssetDecimals", + "defined_out": [ + "check%1#0", + "tmp%0#0", + "value%1#0" + ], + "stack_out": [ + "tmp%0#0", + "value%1#0", + "check%1#0" + ] + }, + "2282": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "value%1#0" + ] + }, + "2283": { + "op": "itob", + "defined_out": [ + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0" + ] + }, + "2284": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ] + }, + "2285": { + "op": "bitlen", + "defined_out": [ + "bitlen%0#0", + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "bitlen%0#0" + ] + }, + "2286": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "bitlen%0#0", + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "bitlen%0#0", + "8" + ] + }, + "2287": { + "op": "<=", + "defined_out": [ + "no_overflow%0#0", + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "no_overflow%0#0" + ] + }, + "2288": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0" + ] + }, + "2289": { + "op": "extract 7 1", + "defined_out": [ + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0" + ] + }, + "2292": { + "op": "pushbytes 0x0003", + "defined_out": [ + "0x0003", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "0x0003" + ] + }, + "2296": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "0x0003", + "uint8%0#0" + ] + }, + "2297": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%2#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2298": { + "op": "swap", + "stack_out": [ + "encoded_tuple_buffer%2#0", + "tmp%0#0" + ] + }, + "2299": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%3#0" + ], + "stack_out": [ + "encoded_tuple_buffer%3#0" + ] + }, + "2300": { + "retsub": true, + "op": "retsub" + }, + "2301": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_micro", + "stack_in": [], + "op": "proto 1 1" + }, + "2304": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "2306": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", + "op": "callsub _get_asset_micro", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2309": { + "retsub": true, + "op": "retsub" + }, + "2310": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_micro", + "stack_in": [], + "op": "proto 1 0" + }, + "2313": { + "op": "frame_dig -1", + "defined_out": [ + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)" + ] + }, + "2315": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)", + "0" + ] + }, + "2316": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "2317": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2318": { + "block": "get_assets_micro_for_header@1", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2320": { + "op": "frame_dig 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "2322": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "2323": { + "op": "bz get_assets_micro_after_for@4", + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2326": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "2328": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "2331": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "2333": { + "op": "dup", + "defined_out": [ + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "_i#0 (copy)" + ] + }, + "2334": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)" + ] + }, + "2336": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "8" + ] + }, + "2337": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "2338": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%0#0" + ] + }, + "2339": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", + "op": "callsub _get_asset_micro", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%1#0" + ] + }, + "2342": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2343": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "2344": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2345": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2347": { + "op": "b get_assets_micro_for_header@1" + }, + "2350": { + "block": "get_assets_micro_after_for@4", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "retsub": true, + "op": "retsub" + }, + "2351": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels", + "params": { + "asset_id#0": "uint64" + }, + "block": "_get_asset_micro_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "2354": { + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "asset_id#0 (copy)" + ] + }, + "2356": { + "op": "asset_params_get AssetUnitName", + "defined_out": [ + "check%0#0", + "value%0#0" + ], + "stack_out": [ + "value%0#0", + "check%0#0" + ] + }, + "2358": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "value%0#0" + ] + }, + "2359": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2362": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "asset_id#0 (copy)" + ] + }, + "2364": { + "op": "asset_params_get AssetDecimals", + "defined_out": [ + "check%1#0", + "tmp%0#0", + "value%1#0" + ], + "stack_out": [ + "tmp%0#0", + "value%1#0", + "check%1#0" + ] + }, + "2366": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "value%1#0" + ] + }, + "2367": { + "op": "itob", + "defined_out": [ + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0" + ] + }, + "2368": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ] + }, + "2369": { + "op": "bitlen", + "defined_out": [ + "bitlen%0#0", + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "bitlen%0#0" + ] + }, + "2370": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "bitlen%0#0", + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "bitlen%0#0", + "8" + ] + }, + "2371": { + "op": "<=", + "defined_out": [ + "no_overflow%0#0", + "tmp%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0", + "no_overflow%0#0" + ] + }, + "2372": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "tmp%0#0", + "val_as_bytes%0#0" + ] + }, + "2373": { + "op": "extract 7 1", + "defined_out": [ + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0" + ] + }, + "2376": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "asset_id#0 (copy)" + ] + }, + "2378": { + "op": "itob", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0" + ] + }, + "2379": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "tmp%1#0" + ] + }, + "2380": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2381": { + "op": "bury 1", + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "maybe_exists%0#0" + ] + }, + "2383": { + "op": "bz _get_asset_micro_labels_ternary_false@2", + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0" + ] + }, + "2386": { + "op": "frame_dig 2", + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "tmp%1#0" + ] + }, + "2388": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2389": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "defined_out": [ + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1" + ] + }, + "2390": { + "block": "_get_asset_micro_labels_ternary_merge@3", + "stack_in": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1" + ], + "op": "frame_dig 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0" + ] + }, + "2392": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "2393": { + "op": "len", + "defined_out": [ + "data_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "data_length%0#0" + ] + }, + "2394": { + "op": "pushint 5 // 5", + "defined_out": [ + "5", + "data_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "data_length%0#0", + "5" + ] + }, + "2396": { + "op": "+", + "defined_out": [ + "current_tail_offset%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0" + ] + }, + "2397": { + "op": "pushbytes 0x0005", + "defined_out": [ + "0x0005", + "current_tail_offset%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "0x0005" + ] + }, + "2401": { + "op": "frame_dig 1", + "defined_out": [ + "0x0005", + "current_tail_offset%1#0", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "0x0005", + "uint8%0#0" + ] + }, + "2403": { + "op": "concat", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2404": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%1#0" + ] + }, + "2405": { + "op": "itob", + "defined_out": [ + "as_bytes%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "encoded_tuple_buffer%2#0", + "as_bytes%1#0" + ] + }, + "2406": { + "op": "extract 6 2", + "defined_out": [ + "encoded_tuple_buffer%2#0", + "offset_as_uint16%1#0", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "encoded_tuple_buffer%2#0", + "offset_as_uint16%1#0" + ] + }, + "2409": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "tmp%0#0", + "encoded_tuple_buffer%3#0" + ] + }, + "2410": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "encoded_tuple_buffer%3#0", + "tmp%0#0" + ] + }, + "2411": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1", + "encoded_tuple_buffer%4#0" + ] + }, + "2412": { + "op": "swap", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "ternary_result%0#1", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "encoded_tuple_buffer%4#0", + "ternary_result%0#1" + ] + }, + "2413": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%5#0", + "tmp%0#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "encoded_tuple_buffer%5#0" + ] + }, + "2414": { + "op": "frame_bury 0" + }, + "2416": { + "retsub": true, + "op": "retsub" + }, + "2417": { + "block": "_get_asset_micro_labels_ternary_false@2", + "stack_in": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "ternary_result%0#1" + ], + "stack_out": [ + "tmp%0#0", + "uint8%0#0", + "tmp%1#0", + "ternary_result%0#1" + ] + }, + "2418": { + "op": "b _get_asset_micro_labels_ternary_merge@3" + }, + "2421": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro_labels", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_micro_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "2424": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "2426": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels", + "op": "callsub _get_asset_micro_labels", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2429": { + "retsub": true, + "op": "retsub" + }, + "2430": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro_labels", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_micro_labels", + "stack_in": [], + "op": "proto 1 0" + }, + "2433": { + "op": "frame_dig -1", + "defined_out": [ + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)" + ] + }, + "2435": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)", + "0" + ] + }, + "2436": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "2437": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2438": { + "block": "get_assets_micro_labels_for_header@1", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2440": { + "op": "frame_dig 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "2442": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "2443": { + "op": "bz get_assets_micro_labels_after_for@4", + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2446": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "2448": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "2451": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "2453": { + "op": "dup", + "defined_out": [ + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "_i#0 (copy)" + ] + }, + "2454": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)" + ] + }, + "2456": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "8" + ] + }, + "2457": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "2458": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%0#0" + ] + }, + "2459": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels", + "op": "callsub _get_asset_micro_labels", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%1#0" + ] + }, + "2462": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2463": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "2464": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2465": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2467": { + "op": "b get_assets_micro_labels_for_header@1" + }, + "2470": { + "block": "get_assets_micro_labels_after_for@4", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "retsub": true, + "op": "retsub" + }, + "2471": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", + "params": { + "asset_id#0": "uint64" + }, + "block": "_get_asset_text", + "stack_in": [], + "op": "proto 1 1" + }, + "2474": { + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "asset_id#0 (copy)" + ] + }, + "2476": { + "op": "asset_params_get AssetName", + "defined_out": [ + "check%0#0", + "value%0#0" + ], + "stack_out": [ + "value%0#0", + "check%0#0" + ] + }, + "2478": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "value%0#0" + ] + }, + "2479": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2482": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "asset_id#0 (copy)" + ] + }, + "2484": { + "op": "asset_params_get AssetUnitName", + "defined_out": [ + "check%1#0", + "tmp%0#0", + "value%1#0" + ], + "stack_out": [ + "tmp%0#0", + "value%1#0", + "check%1#0" + ] + }, + "2486": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "value%1#0" + ] + }, + "2487": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0" + ] + }, + "2490": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "asset_id#0 (copy)" + ] + }, + "2492": { + "op": "asset_params_get AssetURL", + "defined_out": [ + "check%2#0", + "tmp%0#0", + "tmp%1#0", + "value%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "value%2#0", + "check%2#0" + ] + }, + "2494": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "value%2#0" + ] + }, + "2495": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ] + }, + "2498": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "asset_id#0 (copy)" + ] + }, + "2500": { + "op": "itob", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ] + }, + "2501": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "tmp%3#0" + ] + }, + "2502": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2503": { + "op": "bury 1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "maybe_exists%0#0" + ] + }, + "2505": { + "op": "bz _get_asset_text_ternary_false@2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ] + }, + "2508": { + "op": "frame_dig 3", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "tmp%3#0" + ] + }, + "2510": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2511": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "defined_out": [ + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1" + ] + }, + "2512": { + "block": "_get_asset_text_ternary_merge@3", + "stack_in": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1" + ], + "op": "frame_dig 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0" + ] + }, + "2514": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "2515": { + "op": "len", + "defined_out": [ + "data_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "data_length%0#0" + ] + }, + "2516": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "data_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "data_length%0#0", + "8" + ] + }, + "2517": { + "op": "+", + "defined_out": [ + "current_tail_offset%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0" + ] + }, + "2518": { + "op": "dup", + "defined_out": [ + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)" + ] + }, + "2519": { + "op": "itob", + "defined_out": [ + "as_bytes%1#0", + "current_tail_offset%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "as_bytes%1#0" + ] + }, + "2520": { + "op": "extract 6 2", + "defined_out": [ + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0" + ] + }, + "2523": { + "op": "pushbytes 0x0008", + "defined_out": [ + "0x0008", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "0x0008" + ] + }, + "2527": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "0x0008", + "offset_as_uint16%1#0" + ] + }, + "2528": { + "op": "concat", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2529": { + "op": "frame_dig 1", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%1#0" + ] + }, + "2531": { + "op": "dup", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%1#0 (copy)", + "tmp%1#0 (copy)" + ] + }, + "2532": { + "op": "cover 3", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%1#0 (copy)" + ] + }, + "2534": { + "op": "len", + "defined_out": [ + "current_tail_offset%1#0", + "data_length%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0" + ] + }, + "2535": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0", + "current_tail_offset%1#0" + ] + }, + "2537": { + "op": "+", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0" + ] + }, + "2538": { + "op": "dup", + "defined_out": [ + "current_tail_offset%2#0", + "current_tail_offset%2#0 (copy)", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0", + "current_tail_offset%2#0 (copy)" + ] + }, + "2539": { + "op": "itob", + "defined_out": [ + "as_bytes%2#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0", + "as_bytes%2#0" + ] + }, + "2540": { + "op": "extract 6 2", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "offset_as_uint16%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0", + "offset_as_uint16%2#0" + ] + }, + "2543": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "offset_as_uint16%2#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2545": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "offset_as_uint16%2#0" + ] + }, + "2546": { + "op": "concat", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0" + ] + }, + "2547": { + "op": "frame_dig 2", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%2#0" + ] + }, + "2549": { + "op": "dup", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%2#0 (copy)", + "tmp%2#0 (copy)" + ] + }, + "2550": { + "op": "cover 3", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%2#0 (copy)" + ] + }, + "2552": { + "op": "len", + "defined_out": [ + "current_tail_offset%2#0", + "data_length%2#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "data_length%2#0" + ] + }, + "2553": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%3#0", + "data_length%2#0", + "current_tail_offset%2#0" + ] + }, + "2555": { + "op": "+", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%3#0", + "current_tail_offset%3#0" + ] + }, + "2556": { + "op": "itob", + "defined_out": [ + "as_bytes%3#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%3#0", + "as_bytes%3#0" + ] + }, + "2557": { + "op": "extract 6 2", + "defined_out": [ + "encoded_tuple_buffer%3#0", + "offset_as_uint16%3#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%3#0", + "offset_as_uint16%3#0" + ] + }, + "2560": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%4#0" + ] + }, + "2561": { + "op": "uncover 3", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%4#0", + "tmp%0#0" + ] + }, + "2563": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%5#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%5#0" + ] + }, + "2564": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%2#0", + "encoded_tuple_buffer%5#0", + "tmp%1#0" + ] + }, + "2566": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%6#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%2#0", + "encoded_tuple_buffer%6#0" + ] + }, + "2567": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "encoded_tuple_buffer%6#0", + "tmp%2#0" + ] + }, + "2568": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%7#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "encoded_tuple_buffer%7#0" + ] + }, + "2569": { + "op": "swap", + "defined_out": [ + "encoded_tuple_buffer%7#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "encoded_tuple_buffer%7#0", + "ternary_result%0#1" + ] + }, + "2570": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%8#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "encoded_tuple_buffer%8#0" + ] + }, + "2571": { + "op": "frame_bury 0" + }, + "2573": { + "retsub": true, + "op": "retsub" + }, + "2574": { + "block": "_get_asset_text_ternary_false@2", + "stack_in": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "ternary_result%0#1" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1" + ] + }, + "2575": { + "op": "b _get_asset_text_ternary_merge@3" + }, + "2578": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_text", + "stack_in": [], + "op": "proto 1 1" + }, + "2581": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "2583": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", + "op": "callsub _get_asset_text", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2586": { + "retsub": true, + "op": "retsub" + }, + "2587": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_text", + "stack_in": [], + "op": "proto 1 0" + }, + "2590": { + "op": "frame_dig -1", + "defined_out": [ + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)" + ] + }, + "2592": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)", + "0" + ] + }, + "2593": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "2594": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2595": { + "block": "get_assets_text_for_header@1", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2597": { + "op": "frame_dig 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "2599": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "2600": { + "op": "bz get_assets_text_after_for@4", + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2603": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "2605": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "2608": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "2610": { + "op": "dup", + "defined_out": [ + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "_i#0 (copy)" + ] + }, + "2611": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)" + ] + }, + "2613": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "8" + ] + }, + "2614": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "2615": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%0#0" + ] + }, + "2616": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", + "op": "callsub _get_asset_text", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%1#0" + ] + }, + "2619": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2620": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "2621": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2622": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2624": { + "op": "b get_assets_text_for_header@1" + }, + "2627": { + "block": "get_assets_text_after_for@4", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "retsub": true, + "op": "retsub" + }, + "2628": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small", + "params": { + "asset_id#0": "uint64" + }, + "block": "_get_asset_small", + "stack_in": [], + "op": "proto 1 1" + }, + "2631": { + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "asset_id#0 (copy)" + ] + }, + "2633": { + "op": "asset_params_get AssetName", + "defined_out": [ + "check%0#0", + "value%0#0" + ], + "stack_out": [ + "value%0#0", + "check%0#0" + ] + }, + "2635": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "value%0#0" + ] + }, + "2636": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2639": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "asset_id#0 (copy)" + ] + }, + "2641": { + "op": "asset_params_get AssetUnitName", + "defined_out": [ + "check%1#0", + "tmp%0#0", + "value%1#0" + ], + "stack_out": [ + "tmp%0#0", + "value%1#0", + "check%1#0" + ] + }, + "2643": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "value%1#0" + ] + }, + "2644": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0" + ] + }, + "2647": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "asset_id#0 (copy)" + ] + }, + "2649": { + "op": "asset_params_get AssetDecimals", + "defined_out": [ + "check%2#0", + "tmp%0#0", + "tmp%1#0", + "value%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "value%2#0", + "check%2#0" + ] + }, + "2651": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "value%2#0" + ] + }, + "2652": { + "op": "itob", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0" + ] + }, + "2653": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%0#0 (copy)" + ] + }, + "2654": { + "op": "bitlen", + "defined_out": [ + "bitlen%0#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "bitlen%0#0" + ] + }, + "2655": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "bitlen%0#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "bitlen%0#0", + "8" + ] + }, + "2656": { + "op": "<=", + "defined_out": [ + "no_overflow%0#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "no_overflow%0#0" + ] + }, + "2657": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0" + ] + }, + "2658": { + "op": "extract 7 1", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ] + }, + "2661": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "asset_id#0 (copy)" + ] + }, + "2663": { + "op": "asset_params_get AssetTotal", + "defined_out": [ + "check%3#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "value%3#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "value%3#0", + "check%3#0" + ] + }, + "2665": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "value%3#0" + ] + }, + "2666": { + "op": "itob", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ] + }, + "2667": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "asset_id#0 (copy)" + ] + }, + "2669": { + "op": "asset_params_get AssetFreeze", + "defined_out": [ + "check%4#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "value%4#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "value%4#0", + "check%4#0" + ] + }, + "2671": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "value%4#0" + ] + }, + "2672": { + "op": "global ZeroAddress", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "uint8%0#0", + "val_as_bytes%1#0", + "value%4#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "value%4#0", + "tmp%2#0" + ] + }, + "2674": { + "op": "!=", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "to_encode%0#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "to_encode%0#0" + ] + }, + "2675": { + "op": "pushbytes 0x00", + "defined_out": [ + "0x00", + "tmp%0#0", + "tmp%1#0", + "to_encode%0#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "to_encode%0#0", + "0x00" + ] + }, + "2678": { + "op": "intc_1 // 0", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "to_encode%0#0", + "0x00", + "0" + ] + }, + "2679": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "0x00", + "0", + "to_encode%0#0" + ] + }, + "2681": { + "op": "setbit", + "defined_out": [ + "encoded_bool%0#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0" + ] + }, + "2682": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "asset_id#0 (copy)" + ] + }, + "2684": { + "op": "asset_params_get AssetClawback", + "defined_out": [ + "check%5#0", + "encoded_bool%0#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "value%5#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "value%5#0", + "check%5#0" + ] + }, + "2686": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "value%5#0" + ] + }, + "2687": { + "op": "global ZeroAddress", + "defined_out": [ + "encoded_bool%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%3#0", + "uint8%0#0", + "val_as_bytes%1#0", + "value%5#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "value%5#0", + "tmp%3#0" + ] + }, + "2689": { + "op": "!=", + "defined_out": [ + "encoded_bool%0#0", + "tmp%0#0", + "tmp%1#0", + "to_encode%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "to_encode%1#0" + ] + }, + "2690": { + "op": "pushbytes 0x00", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "to_encode%1#0", + "0x00" + ] + }, + "2693": { + "op": "intc_1 // 0", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "to_encode%1#0", + "0x00", + "0" + ] + }, + "2694": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "0x00", + "0", + "to_encode%1#0" + ] + }, + "2696": { + "op": "setbit", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0" + ] + }, + "2697": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "asset_id#0 (copy)" + ] + }, + "2699": { + "op": "itob", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%4#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0" + ] + }, + "2700": { + "op": "dup", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%4#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "2701": { + "op": "box_len", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%4#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2702": { + "op": "bury 1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "maybe_exists%0#0" + ] + }, + "2704": { + "op": "bz _get_asset_small_ternary_false@2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0" + ] + }, + "2707": { + "op": "frame_dig 6", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "2709": { + "op": "box_get", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%4#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2710": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%4#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1" + ] + }, + "2711": { + "block": "_get_asset_small_ternary_merge@3", + "stack_in": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1" + ], + "op": "frame_dig 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0" + ] + }, + "2713": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "2714": { + "op": "len", + "defined_out": [ + "data_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "data_length%0#0" + ] + }, + "2715": { + "op": "pushint 16 // 16", + "defined_out": [ + "16", + "data_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "data_length%0#0", + "16" + ] + }, + "2717": { + "op": "+", + "defined_out": [ + "current_tail_offset%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0" + ] + }, + "2718": { + "op": "dup", + "defined_out": [ + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)" + ] + }, + "2719": { + "op": "itob", + "defined_out": [ + "as_bytes%1#0", + "current_tail_offset%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "as_bytes%1#0" + ] + }, + "2720": { + "op": "extract 6 2", + "defined_out": [ + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0" + ] + }, + "2723": { + "op": "pushbytes 0x0010", + "defined_out": [ + "0x0010", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "0x0010" + ] + }, + "2727": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "0x0010", + "offset_as_uint16%1#0" + ] + }, + "2728": { + "op": "concat", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2729": { + "op": "frame_dig 1", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%1#0" + ] + }, + "2731": { + "op": "dup", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0", + "tmp%1#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%1#0 (copy)", + "tmp%1#0 (copy)" + ] + }, + "2732": { + "op": "cover 3", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%1#0 (copy)" + ] + }, + "2734": { + "op": "len", + "defined_out": [ + "current_tail_offset%1#0", + "data_length%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0" + ] + }, + "2735": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0", + "current_tail_offset%1#0" + ] + }, + "2737": { + "op": "+", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0" + ] + }, + "2738": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2739": { + "op": "frame_dig 2", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "uint8%0#0" + ] + }, + "2741": { + "op": "concat", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0" + ] + }, + "2742": { + "op": "frame_dig 3", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "val_as_bytes%1#0" + ] + }, + "2744": { + "op": "concat", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%4#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%4#0" + ] + }, + "2745": { + "op": "frame_dig 4", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_bool%0#0", + "encoded_tuple_buffer%4#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%4#0", + "encoded_bool%0#0" + ] + }, + "2747": { + "op": "concat", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_bool%0#0", + "encoded_tuple_buffer%5#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%5#0" + ] + }, + "2748": { + "op": "frame_dig 5", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%5#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%5#0", + "encoded_bool%1#0" + ] + }, + "2750": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "current_tail_offset%2#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%5#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%5#0", + "encoded_bool%1#0", + "0" + ] + }, + "2751": { + "op": "getbit", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%5#0", + "is_true%0#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%5#0", + "is_true%0#0" + ] + }, + "2752": { + "op": "pushint 105 // 105" + }, + "2754": { + "op": "swap", + "defined_out": [ + "105", + "current_tail_offset%2#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%5#0", + "is_true%0#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%5#0", + "105", + "is_true%0#0" + ] + }, + "2755": { + "op": "setbit", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%6#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%6#0" + ] + }, + "2756": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%6#0", + "current_tail_offset%2#0" + ] + }, + "2757": { + "op": "itob", + "defined_out": [ + "as_bytes%2#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%6#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%6#0", + "as_bytes%2#0" + ] + }, + "2758": { + "op": "extract 6 2", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%6#0", + "offset_as_uint16%2#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%6#0", + "offset_as_uint16%2#0" + ] + }, + "2761": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%7#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "encoded_tuple_buffer%7#0" + ] + }, + "2762": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%1#0", + "encoded_tuple_buffer%7#0", + "tmp%0#0" + ] + }, + "2764": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%8#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "tmp%1#0", + "encoded_tuple_buffer%8#0" + ] + }, + "2765": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "encoded_tuple_buffer%8#0", + "tmp%1#0" + ] + }, + "2766": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%9#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1", + "encoded_tuple_buffer%9#0" + ] + }, + "2767": { + "op": "swap", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%9#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "encoded_tuple_buffer%9#0", + "ternary_result%0#1" + ] + }, + "2768": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_bool%1#0", + "encoded_tuple_buffer%10#0", + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "encoded_tuple_buffer%10#0" + ] + }, + "2769": { + "op": "frame_bury 0" + }, + "2771": { + "retsub": true, + "op": "retsub" + }, + "2772": { + "block": "_get_asset_small_ternary_false@2", + "stack_in": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "ternary_result%0#1" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "uint8%0#0", + "val_as_bytes%1#0", + "encoded_bool%0#0", + "encoded_bool%1#0", + "tmp%4#0", + "ternary_result%0#1" + ] + }, + "2773": { + "op": "b _get_asset_small_ternary_merge@3" + }, + "2776": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_small", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_small", + "stack_in": [], + "op": "proto 1 1" + }, + "2779": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "2781": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small", + "op": "callsub _get_asset_small", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2784": { + "retsub": true, + "op": "retsub" + }, + "2785": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_small", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_small", + "stack_in": [], + "op": "proto 1 0" + }, + "2788": { + "op": "frame_dig -1", + "defined_out": [ + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)" + ] + }, + "2790": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)", + "0" + ] + }, + "2791": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "2792": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2793": { + "block": "get_assets_small_for_header@1", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2795": { + "op": "frame_dig 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "2797": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "2798": { + "op": "bz get_assets_small_after_for@4", + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2801": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "2803": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "2806": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "2808": { + "op": "dup", + "defined_out": [ + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "_i#0 (copy)" + ] + }, + "2809": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)" + ] + }, + "2811": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "8" + ] + }, + "2812": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "2813": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%0#0" + ] + }, + "2814": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small", + "op": "callsub _get_asset_small", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%1#0" + ] + }, + "2817": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2818": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "2819": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2820": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2822": { + "op": "b get_assets_small_for_header@1" + }, + "2825": { + "block": "get_assets_small_after_for@4", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "retsub": true, + "op": "retsub" + }, + "2826": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full", + "params": { + "asset_id#0": "uint64" + }, + "block": "_get_asset_full", + "stack_in": [], + "op": "proto 1 1" + }, + "2829": { + "op": "intc_1 // 0", + "stack_out": [ + "encoded_value%0#0" + ] + }, + "2830": { + "op": "dupn 11", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ] + }, + "2832": { + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "asset_id#0 (copy)" + ] + }, + "2834": { + "op": "asset_params_get AssetReserve", + "defined_out": [ + "check%0#0", + "reserve_acct#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "check%0#0" + ] + }, + "2836": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "check%0#0", + "reserve_acct#0" + ] + }, + "2837": { + "op": "dup", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "check%0#0", + "reserve_acct#0", + "reserve_acct#0 (copy)" + ] + }, + "2838": { + "op": "uncover 2", + "defined_out": [ + "check%0#0", + "reserve_acct#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_acct#0", + "check%0#0" + ] + }, + "2840": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_acct#0" + ] + }, + "2841": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_acct#0", + "asset_id#0 (copy)" + ] + }, + "2843": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "reserve_acct#0", + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "tmp%2#0", + "tmp%3#0" + ] + }, + "2845": { + "op": "bury 1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "tmp%3#0" + ] + }, + "2847": { + "op": "bz _get_asset_full_ternary_false@2", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0" + ] + }, + "2850": { + "op": "frame_dig 12", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_acct#0" + ] + }, + "2852": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_acct#0", + "asset_id#0 (copy)" + ] + }, + "2854": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "check%1#0", + "reserve_acct#0", + "value%1#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "value%1#0", + "check%1#0" + ] + }, + "2856": { + "error": "account opted into asset", + "op": "assert // account opted into asset", + "defined_out": [ + "reserve_acct#0", + "reserve_balance#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2857": { + "block": "_get_asset_full_ternary_merge@3", + "stack_in": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ], + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2859": { + "op": "asset_params_get AssetName", + "defined_out": [ + "check%2#0", + "value%2#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%2#0", + "check%2#0" + ] + }, + "2861": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%2#0" + ] + }, + "2862": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "tmp%4#0" + ] + }, + "2865": { + "op": "frame_bury 1", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2867": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2869": { + "op": "asset_params_get AssetUnitName", + "defined_out": [ + "check%3#0", + "tmp%4#0", + "value%3#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%3#0", + "check%3#0" + ] + }, + "2871": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%3#0" + ] + }, + "2872": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "tmp%5#0" + ] + }, + "2875": { + "op": "frame_bury 2", + "defined_out": [ + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2877": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2879": { + "op": "asset_params_get AssetURL", + "defined_out": [ + "check%4#0", + "tmp%4#0", + "tmp%5#0", + "value%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%4#0", + "check%4#0" + ] + }, + "2881": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%4#0" + ] + }, + "2882": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "tmp%6#0" + ] + }, + "2885": { + "op": "frame_bury 3", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2887": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2889": { + "op": "asset_params_get AssetTotal", + "defined_out": [ + "check%5#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "value%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%5#0", + "check%5#0" + ] + }, + "2891": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%5#0" + ] + }, + "2892": { + "op": "itob", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "val_as_bytes%0#0" + ] + }, + "2893": { + "op": "frame_bury 6", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2895": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2897": { + "op": "asset_params_get AssetDecimals", + "defined_out": [ + "check%6#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "value%6#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%6#0", + "check%6#0" + ] + }, + "2899": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%6#0" + ] + }, + "2900": { + "op": "itob", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "val_as_bytes%1#0" + ] + }, + "2901": { + "op": "dup", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%1#0 (copy)" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "val_as_bytes%1#0", + "val_as_bytes%1#0 (copy)" + ] + }, + "2902": { + "op": "bitlen", + "defined_out": [ + "bitlen%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "val_as_bytes%1#0", + "bitlen%0#0" + ] + }, + "2903": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "bitlen%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "val_as_bytes%1#0", + "bitlen%0#0", + "8" + ] + }, + "2904": { + "op": "<=", + "defined_out": [ + "no_overflow%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "val_as_bytes%1#0", + "no_overflow%0#0" + ] + }, + "2905": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "val_as_bytes%1#0" + ] + }, + "2906": { + "op": "extract 7 1", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "uint8%0#0" + ] + }, + "2909": { + "op": "frame_bury 5", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2911": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2913": { + "op": "asset_params_get AssetManager", + "defined_out": [ + "check%7#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%7#0", + "check%7#0" + ] + }, + "2915": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%7#0", + "value%7#0" + ] + }, + "2916": { + "op": "frame_bury 9", + "defined_out": [ + "check%7#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%7#0" + ] + }, + "2918": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2919": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2921": { + "op": "asset_params_get AssetFreeze", + "defined_out": [ + "check%8#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0", + "value%8#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%8#0", + "check%8#0" + ] + }, + "2923": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%8#0", + "value%8#0" + ] + }, + "2924": { + "op": "frame_bury 10", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%8#0" + ] + }, + "2926": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2927": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2929": { + "op": "asset_params_get AssetClawback", + "defined_out": [ + "check%9#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%9#0", + "check%9#0" + ] + }, + "2931": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%9#0", + "value%9#0" + ] + }, + "2932": { + "op": "frame_bury 11", + "defined_out": [ + "check%9#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%9#0" + ] + }, + "2934": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2935": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2937": { + "op": "asset_params_get AssetReserve", + "defined_out": [ + "check%10#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%10#0", + "check%10#0" + ] + }, + "2939": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%10#0", + "value%10#0" + ] + }, + "2940": { + "op": "frame_bury 8", + "defined_out": [ + "check%10#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "check%10#0" + ] + }, + "2942": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2943": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "asset_id#0 (copy)" + ] + }, + "2945": { + "op": "asset_params_get AssetMetadataHash", + "defined_out": [ + "check%11#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%11#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%11#0", + "check%11#0" + ] + }, + "2947": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%11#0" + ] + }, + "2948": { + "op": "dup", + "defined_out": [ + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%11#0", + "value%11#0 (copy)", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%11#0", + "value%11#0 (copy)" + ] + }, + "2949": { + "op": "len", + "defined_out": [ + "length%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%11#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%11#0", + "length%0#0" + ] + }, + "2950": { + "op": "itob", + "defined_out": [ + "as_bytes%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%11#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%11#0", + "as_bytes%0#0" + ] + }, + "2951": { + "op": "extract 6 2", + "defined_out": [ + "length_uint16%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%11#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "value%11#0", + "length_uint16%0#0" + ] + }, + "2954": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "length_uint16%0#0", + "value%11#0" + ] + }, + "2955": { + "op": "concat", + "defined_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0", + "encoded_value%0#0" + ] + }, + "2956": { + "op": "frame_bury 0", + "defined_out": [ + "encoded_value%0#0", + "reserve_balance#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "2958": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "val_as_bytes%2#0" + ] + }, + "2959": { + "op": "frame_bury 7", + "defined_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0" + ] + }, + "2961": { + "op": "frame_dig -1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "asset_id#0 (copy)" + ] + }, + "2963": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "tmp%7#0" + ] + }, + "2964": { + "op": "dup", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "tmp%7#0", + "tmp%7#0" + ] + }, + "2965": { + "op": "frame_bury 4", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "tmp%7#0" + ] + }, + "2967": { + "op": "box_len", + "defined_out": [ + "encoded_value%0#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2968": { + "op": "bury 1", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "maybe_exists%0#0" + ] + }, + "2970": { + "op": "bz _get_asset_full_ternary_false@5", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0" + ] + }, + "2973": { + "op": "frame_dig 4", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "tmp%7#0" + ] + }, + "2975": { + "op": "box_get", + "defined_out": [ + "encoded_value%0#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2976": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", + "defined_out": [ + "encoded_value%0#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1" + ] + }, + "2977": { + "block": "_get_asset_full_ternary_merge@6", + "stack_in": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1" + ], + "op": "frame_dig 1", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0" + ] + }, + "2979": { + "op": "dup", + "defined_out": [ + "tmp%4#0", + "tmp%4#0 (copy)" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%4#0 (copy)" + ] + }, + "2980": { + "op": "len", + "defined_out": [ + "data_length%0#0", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "data_length%0#0" + ] + }, + "2981": { + "op": "pushint 155 // 155", + "defined_out": [ + "155", + "data_length%0#0", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "data_length%0#0", + "155" + ] + }, + "2984": { + "op": "+", + "defined_out": [ + "current_tail_offset%1#0", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0" + ] + }, + "2985": { + "op": "dup", + "defined_out": [ + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)" + ] + }, + "2986": { + "op": "itob", + "defined_out": [ + "as_bytes%2#0", + "current_tail_offset%1#0", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "as_bytes%2#0" + ] + }, + "2987": { + "op": "extract 6 2", + "defined_out": [ + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0" + ] + }, + "2990": { + "op": "pushbytes 0x009b", + "defined_out": [ + "0x009b", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "0x009b" + ] + }, + "2994": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "0x009b", + "offset_as_uint16%1#0" + ] + }, + "2995": { + "op": "concat", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%4#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2996": { + "op": "frame_dig 2", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%5#0" + ] + }, + "2998": { + "op": "dup", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%4#0", + "tmp%5#0", + "tmp%5#0 (copy)" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%5#0 (copy)", + "tmp%5#0 (copy)" + ] + }, + "2999": { + "op": "cover 3", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%5#0 (copy)" + ] + }, + "3001": { + "op": "len", + "defined_out": [ + "current_tail_offset%1#0", + "data_length%1#0", + "encoded_tuple_buffer%2#0", + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0" + ] + }, + "3002": { + "op": "uncover 2", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0", + "current_tail_offset%1#0" + ] + }, + "3004": { + "op": "+", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0" + ] + }, + "3005": { + "op": "dup", + "defined_out": [ + "current_tail_offset%2#0", + "current_tail_offset%2#0 (copy)", + "encoded_tuple_buffer%2#0", + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0", + "current_tail_offset%2#0 (copy)" + ] + }, + "3006": { + "op": "itob", + "defined_out": [ + "as_bytes%3#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0", + "as_bytes%3#0" + ] + }, + "3007": { + "op": "extract 6 2", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "offset_as_uint16%2#0", + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0", + "offset_as_uint16%2#0" + ] + }, + "3010": { + "op": "uncover 2", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "current_tail_offset%2#0", + "offset_as_uint16%2#0", + "encoded_tuple_buffer%2#0" + ] + }, + "3012": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "offset_as_uint16%2#0" + ] + }, + "3013": { + "op": "concat", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0" + ] + }, + "3014": { + "op": "frame_dig 3", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%6#0" + ] + }, + "3016": { + "op": "dup", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%6#0 (copy)" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%6#0 (copy)", + "tmp%6#0 (copy)" + ] + }, + "3017": { + "op": "cover 3", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "tmp%6#0 (copy)" + ] + }, + "3019": { + "op": "len", + "defined_out": [ + "current_tail_offset%2#0", + "data_length%2#0", + "encoded_tuple_buffer%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%2#0", + "encoded_tuple_buffer%3#0", + "data_length%2#0" + ] + }, + "3020": { + "op": "uncover 2", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_tuple_buffer%3#0", + "data_length%2#0", + "current_tail_offset%2#0" + ] + }, + "3022": { + "op": "+", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_tuple_buffer%3#0", + "current_tail_offset%3#0" + ] + }, + "3023": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%3#0" + ] + }, + "3024": { + "op": "frame_dig 6", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%3#0", + "val_as_bytes%0#0" + ] + }, + "3026": { + "op": "concat", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%4#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%4#0" + ] + }, + "3027": { + "op": "frame_dig 5", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%4#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%4#0", + "uint8%0#0" + ] + }, + "3029": { + "op": "concat", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%5#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%5#0" + ] + }, + "3030": { + "op": "frame_dig 9", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%5#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%5#0", + "value%7#0" + ] + }, + "3032": { + "op": "concat", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%6#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%6#0" + ] + }, + "3033": { + "op": "frame_dig 10", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%6#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0", + "value%8#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%6#0", + "value%8#0" + ] + }, + "3035": { + "op": "concat", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%7#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0", + "value%8#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%7#0" + ] + }, + "3036": { + "op": "frame_dig 11", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%7#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%7#0", + "value%9#0" + ] + }, + "3038": { + "op": "concat", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%8#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%8#0" + ] + }, + "3039": { + "op": "frame_dig 8", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%8#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%8#0", + "value%10#0" + ] + }, + "3041": { + "op": "concat", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%9#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%9#0" + ] + }, + "3042": { + "op": "dig 1", + "defined_out": [ + "current_tail_offset%3#0", + "current_tail_offset%3#0 (copy)", + "encoded_tuple_buffer%9#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%9#0", + "current_tail_offset%3#0 (copy)" + ] + }, + "3044": { + "op": "itob", + "defined_out": [ + "as_bytes%4#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%9#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%9#0", + "as_bytes%4#0" + ] + }, + "3045": { + "op": "extract 6 2", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%9#0", + "offset_as_uint16%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%9#0", + "offset_as_uint16%3#0" + ] + }, + "3048": { + "op": "concat", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0" + ] + }, + "3049": { + "op": "frame_dig 0", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0" + ] + }, + "3051": { + "op": "dup", + "defined_out": [ + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0", + "encoded_value%0#0 (copy)", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0 (copy)", + "encoded_value%0#0 (copy)" + ] + }, + "3052": { + "op": "cover 3", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0 (copy)" + ] + }, + "3054": { + "op": "len", + "defined_out": [ + "current_tail_offset%3#0", + "data_length%3#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "current_tail_offset%3#0", + "encoded_tuple_buffer%10#0", + "data_length%3#0" + ] + }, + "3055": { + "op": "uncover 2", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%10#0", + "data_length%3#0", + "current_tail_offset%3#0" + ] + }, + "3057": { + "op": "+", + "defined_out": [ + "current_tail_offset%4#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%10#0", + "current_tail_offset%4#0" + ] + }, + "3058": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "current_tail_offset%4#0", + "encoded_tuple_buffer%10#0" + ] + }, + "3059": { + "op": "frame_dig 7", + "defined_out": [ + "current_tail_offset%4#0", + "encoded_tuple_buffer%10#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "current_tail_offset%4#0", + "encoded_tuple_buffer%10#0", + "val_as_bytes%2#0" + ] + }, + "3061": { + "op": "concat", + "defined_out": [ + "current_tail_offset%4#0", + "encoded_tuple_buffer%11#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "current_tail_offset%4#0", + "encoded_tuple_buffer%11#0" + ] + }, + "3062": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%11#0", + "current_tail_offset%4#0" + ] + }, + "3063": { + "op": "itob", + "defined_out": [ + "as_bytes%5#0", + "encoded_tuple_buffer%11#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%11#0", + "as_bytes%5#0" + ] + }, + "3064": { + "op": "extract 6 2", + "defined_out": [ + "encoded_tuple_buffer%11#0", + "encoded_value%0#0", + "offset_as_uint16%4#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%11#0", + "offset_as_uint16%4#0" + ] + }, + "3067": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%12#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%12#0" + ] + }, + "3068": { + "op": "uncover 4", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%12#0", + "tmp%4#0" + ] + }, + "3070": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%13#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%5#0", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%13#0" + ] + }, + "3071": { + "op": "uncover 3", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%13#0", + "tmp%5#0" + ] + }, + "3073": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%14#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "tmp%6#0", + "encoded_value%0#0", + "encoded_tuple_buffer%14#0" + ] + }, + "3074": { + "op": "uncover 2", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "encoded_value%0#0", + "encoded_tuple_buffer%14#0", + "tmp%6#0" + ] + }, + "3076": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%15#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "encoded_value%0#0", + "encoded_tuple_buffer%15#0" + ] + }, + "3077": { + "op": "swap", + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "encoded_tuple_buffer%15#0", + "encoded_value%0#0" + ] + }, + "3078": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%16#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1", + "encoded_tuple_buffer%16#0" + ] + }, + "3079": { + "op": "swap", + "defined_out": [ + "encoded_tuple_buffer%16#0", + "encoded_value%0#0", + "ternary_result%1#1", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "encoded_tuple_buffer%16#0", + "ternary_result%1#1" + ] + }, + "3080": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%17#0", + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "encoded_tuple_buffer%17#0" + ] + }, + "3081": { + "op": "frame_bury 0" + }, + "3083": { + "retsub": true, + "op": "retsub" + }, + "3084": { + "block": "_get_asset_full_ternary_false@5", + "stack_in": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "ternary_result%1#1" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "ternary_result%1#1" + ] + }, + "3085": { + "op": "b _get_asset_full_ternary_merge@6" + }, + "3088": { + "block": "_get_asset_full_ternary_false@2", + "stack_in": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0" + ], + "op": "intc_1 // 0", + "defined_out": [ + "reserve_balance#0" + ], + "stack_out": [ + "encoded_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "uint8%0#0", + "val_as_bytes%0#0", + "val_as_bytes%2#0", + "value%10#0", + "value%7#0", + "value%8#0", + "value%9#0", + "reserve_acct#0", + "reserve_balance#0" + ] + }, + "3089": { + "op": "b _get_asset_full_ternary_merge@3" + }, + "3092": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_full", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_full", + "stack_in": [], + "op": "proto 1 1" + }, + "3095": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "3097": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full", + "op": "callsub _get_asset_full", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "3100": { + "retsub": true, + "op": "retsub" + }, + "3101": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_full", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_full", + "stack_in": [], + "op": "proto 1 0" + }, + "3104": { + "op": "frame_dig -1", + "defined_out": [ + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)" + ] + }, + "3106": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)", + "0" + ] + }, + "3107": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "3108": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "3109": { + "block": "get_assets_full_for_header@1", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "3111": { + "op": "frame_dig 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "3113": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "3114": { + "op": "bz get_assets_full_after_for@4", + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "3117": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "3119": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "3122": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "3124": { + "op": "dup", + "defined_out": [ + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "_i#0 (copy)" + ] + }, + "3125": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)" + ] + }, + "3127": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "8" + ] + }, + "3128": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "3129": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%0#0" + ] + }, + "3130": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full", + "op": "callsub _get_asset_full", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%1#0" + ] + }, + "3133": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "3134": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "3135": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "3136": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "3138": { + "op": "b get_assets_full_for_header@1" + }, + "3141": { + "block": "get_assets_full_after_for@4", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "retsub": true, + "op": "retsub" + } + } +} \ No newline at end of file diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal new file mode 100644 index 0000000..621333e --- /dev/null +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal @@ -0,0 +1,2954 @@ +#pragma version 10 +#pragma typetrack false + +// smart_contracts.asset_labeling.contract.AssetLabeling.__algopy_entrypoint_with_init() -> uint64: +main: + intcblock 1 0 2 8 4294967295 4294967296 + bytecblock 0x151f7c75 "ERR:NOEXIST" 0x0000 "" "admin" "ERR:EXISTS" 0x0002 "ERR:UNAUTH" "ERR:LENGTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0001 + txn ApplicationID + bnz main_after_if_else@2 + // smart_contracts/asset_labeling/contract.py:53 + // self.admin = Txn.sender + bytec 4 // "admin" + txn Sender + app_global_put + +main_after_if_else@2: + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txn NumAppArgs + bz main_bare_routing@27 + pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0xe1bb95fc 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]", method "get_asset_micro(uint64)(string,uint8)", method "get_assets_micro(uint64[])void", method "get_asset_micro_labels(uint64)(string,uint8,string[])", method "get_assets_micro_labels(uint64[])void", method "get_asset_text(uint64)(string,string,string,string[])", method "get_assets_text(uint64[])void", method "get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])", method "get_assets_small(uint64[])void", method "get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])", method "get_assets_full(uint64[])void" + txna ApplicationArgs 0 + match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 main_get_asset_micro_labels_route@19 main_get_assets_micro_labels_route@20 main_get_asset_text_route@21 main_get_assets_text_route@22 main_get_asset_small_route@23 main_get_assets_small_route@24 main_get_asset_full_route@25 main_get_assets_full_route@26 + +main_after_if_else@29: + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + intc_1 // 0 + return + +main_get_assets_full_route@26: + // smart_contracts/asset_labeling/contract.py:408 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:408 + // @abimethod(readonly=True) + callsub get_assets_full + intc_0 // 1 + return + +main_get_asset_full_route@25: + // smart_contracts/asset_labeling/contract.py:404 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + // smart_contracts/asset_labeling/contract.py:404 + // @abimethod(readonly=True) + callsub get_asset_full + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_get_assets_small_route@24: + // smart_contracts/asset_labeling/contract.py:373 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:373 + // @abimethod(readonly=True) + callsub get_assets_small + intc_0 // 1 + return + +main_get_asset_small_route@23: + // smart_contracts/asset_labeling/contract.py:369 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + // smart_contracts/asset_labeling/contract.py:369 + // @abimethod(readonly=True) + callsub get_asset_small + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_get_assets_text_route@22: + // smart_contracts/asset_labeling/contract.py:349 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:349 + // @abimethod(readonly=True) + callsub get_assets_text + intc_0 // 1 + return + +main_get_asset_text_route@21: + // smart_contracts/asset_labeling/contract.py:345 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + // smart_contracts/asset_labeling/contract.py:345 + // @abimethod(readonly=True) + callsub get_asset_text + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_get_assets_micro_labels_route@20: + // smart_contracts/asset_labeling/contract.py:328 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:328 + // @abimethod(readonly=True) + callsub get_assets_micro_labels + intc_0 // 1 + return + +main_get_asset_micro_labels_route@19: + // smart_contracts/asset_labeling/contract.py:324 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + // smart_contracts/asset_labeling/contract.py:324 + // @abimethod(readonly=True) + callsub get_asset_micro_labels + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_get_assets_micro_route@18: + // smart_contracts/asset_labeling/contract.py:308 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:308 + // @abimethod(readonly=True) + callsub get_assets_micro + intc_0 // 1 + return + +main_get_asset_micro_route@17: + // smart_contracts/asset_labeling/contract.py:304 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + // smart_contracts/asset_labeling/contract.py:304 + // @abimethod(readonly=True) + callsub get_asset_micro + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_get_assets_labels_route@16: + // smart_contracts/asset_labeling/contract.py:277 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:277 + // @abimethod(readonly=True) + callsub get_assets_labels + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_get_asset_labels_route@15: + // smart_contracts/asset_labeling/contract.py:270 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + txnas Assets + // smart_contracts/asset_labeling/contract.py:270 + // @abimethod(readonly=True) + callsub get_asset_labels + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_remove_label_from_asset_route@14: + // smart_contracts/asset_labeling/contract.py:236 + // @abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + extract 2 0 + txna ApplicationArgs 2 + btoi + txnas Assets + // smart_contracts/asset_labeling/contract.py:236 + // @abimethod() + callsub remove_label_from_asset + intc_0 // 1 + return + +main_add_label_to_asset_route@13: + // smart_contracts/asset_labeling/contract.py:208 + // @abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + extract 2 0 + txna ApplicationArgs 2 + btoi + txnas Assets + // smart_contracts/asset_labeling/contract.py:208 + // @abimethod() + callsub add_label_to_asset + intc_0 // 1 + return + +main_get_operator_labels_route@12: + // smart_contracts/asset_labeling/contract.py:192 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + txnas Accounts + // smart_contracts/asset_labeling/contract.py:192 + // @abimethod(readonly=True) + callsub get_operator_labels + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_remove_operator_from_label_route@11: + // smart_contracts/asset_labeling/contract.py:151 + // @abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + txnas Accounts + txna ApplicationArgs 2 + extract 2 0 + // smart_contracts/asset_labeling/contract.py:151 + // @abimethod() + callsub remove_operator_from_label + intc_0 // 1 + return + +main_add_operator_to_label_route@10: + // smart_contracts/asset_labeling/contract.py:123 + // @abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + txnas Accounts + txna ApplicationArgs 2 + extract 2 0 + // smart_contracts/asset_labeling/contract.py:123 + // @abimethod() + callsub add_operator_to_label + intc_0 // 1 + return + +main_log_labels_route@9: + // smart_contracts/asset_labeling/contract.py:92 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:92 + // @abimethod(readonly=True) + callsub log_labels + intc_0 // 1 + return + +main_get_label_route@8: + // smart_contracts/asset_labeling/contract.py:87 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + extract 2 0 + // smart_contracts/asset_labeling/contract.py:87 + // @abimethod(readonly=True) + callsub get_label + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_remove_label_route@7: + // smart_contracts/asset_labeling/contract.py:79 + // @abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + extract 2 0 + // smart_contracts/asset_labeling/contract.py:79 + // @abimethod() + callsub remove_label + intc_0 // 1 + return + +main_add_label_route@6: + // smart_contracts/asset_labeling/contract.py:68 + // @abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + extract 2 0 + txna ApplicationArgs 2 + extract 2 0 + // smart_contracts/asset_labeling/contract.py:68 + // @abimethod() + callsub add_label + intc_0 // 1 + return + +main_change_admin_route@5: + // smart_contracts/asset_labeling/contract.py:63 + // @abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + txnas Accounts + // smart_contracts/asset_labeling/contract.py:63 + // @abimethod() + callsub change_admin + intc_0 // 1 + return + +main_bare_routing@27: + // smart_contracts/asset_labeling/contract.py:51 + // class AssetLabeling(ARC4Contract): + txn OnCompletion + bnz main_after_if_else@29 + txn ApplicationID + ! + assert // can only call when creating + intc_0 // 1 + return + + +// _puya_lib.arc4.dynamic_array_concat_byte_length_head(array: bytes, new_items_bytes: bytes, new_items_count: uint64) -> bytes: +dynamic_array_concat_byte_length_head: + proto 3 1 + frame_dig -3 + intc_1 // 0 + extract_uint16 + dup + frame_dig -1 + + + swap + intc_2 // 2 + * + intc_2 // 2 + + + dig 1 + itob + extract 6 2 + cover 2 + frame_dig -3 + intc_2 // 2 + dig 2 + substring3 + frame_dig -1 + intc_2 // 2 + * + bzero + concat + frame_dig -3 + len + frame_dig -3 + uncover 3 + uncover 2 + substring3 + concat + frame_dig -2 + concat + swap + intc_2 // 2 + * + dup + intc_1 // 0 + swap + +dynamic_array_concat_byte_length_head_for_header@2: + frame_dig 3 + frame_dig 2 + < + bz dynamic_array_concat_byte_length_head_after_for@5 + frame_dig 4 + dup + itob + extract 6 2 + frame_dig 1 + frame_dig 3 + dup + cover 4 + uncover 2 + replace3 + dup + frame_bury 1 + dig 1 + extract_uint16 + intc_2 // 2 + + + + + frame_bury 4 + intc_2 // 2 + + + frame_bury 3 + b dynamic_array_concat_byte_length_head_for_header@2 + +dynamic_array_concat_byte_length_head_after_for@5: + frame_dig 0 + frame_dig 1 + concat + frame_bury 0 + retsub + + +// _puya_lib.arc4.dynamic_array_concat_dynamic_element(array_items_count: uint64, array_head_and_tail: bytes, new_items_count: uint64, new_head_and_tail: bytes) -> bytes: +dynamic_array_concat_dynamic_element: + proto 4 1 + bytec_3 // "" + dup + frame_dig -2 + intc_2 // 2 + * + frame_dig -4 + intc_2 // 2 + * + intc_1 // 0 + +dynamic_array_concat_dynamic_element_for_header@1: + frame_dig 4 + frame_dig 3 + < + bz dynamic_array_concat_dynamic_element_after_for@4 + frame_dig -3 + frame_dig 4 + dup + cover 2 + extract_uint16 + frame_dig 2 + + + itob + extract 6 2 + frame_dig 1 + swap + concat + frame_bury 1 + intc_2 // 2 + + + frame_bury 4 + b dynamic_array_concat_dynamic_element_for_header@1 + +dynamic_array_concat_dynamic_element_after_for@4: + frame_dig -3 + len + frame_bury 0 + intc_1 // 0 + frame_bury 4 + +dynamic_array_concat_dynamic_element_for_header@5: + frame_dig 4 + frame_dig 2 + < + bz dynamic_array_concat_dynamic_element_after_for@8 + frame_dig -1 + frame_dig 4 + dup + cover 2 + extract_uint16 + frame_dig 0 + + + itob + extract 6 2 + frame_dig 1 + swap + concat + frame_bury 1 + intc_2 // 2 + + + frame_bury 4 + b dynamic_array_concat_dynamic_element_for_header@5 + +dynamic_array_concat_dynamic_element_after_for@8: + frame_dig -4 + frame_dig -2 + + + itob + extract 6 2 + frame_dig 1 + concat + frame_dig -3 + frame_dig 3 + frame_dig 0 + substring3 + concat + frame_dig -1 + len + frame_dig -1 + frame_dig 2 + uncover 2 + substring3 + concat + frame_bury 0 + retsub + + +// smart_contracts.asset_labeling.contract.b2str(b: bytes) -> bytes: +b2str: + // smart_contracts/asset_labeling/contract.py:46-47 + // @subroutine + // def b2str(b: Bytes) -> arc4.String: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:48 + // return arc4.String(String.from_bytes(b)) + frame_dig -1 + len + itob + extract 6 2 + frame_dig -1 + concat + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.admin_only() -> void: +admin_only: + // smart_contracts/asset_labeling/contract.py:61 + // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) + txn Sender + intc_1 // 0 + bytec 4 // "admin" + app_global_get_ex + assert // check self.admin exists + == + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz admin_only_after_if_else@3 + // smart_contracts/asset_labeling/contract.py:61 + // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) + bytec 7 // "ERR:UNAUTH" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +admin_only_after_if_else@3: + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.change_admin(new_admin: bytes) -> void: +change_admin: + // smart_contracts/asset_labeling/contract.py:63-64 + // @abimethod() + // def change_admin(self, new_admin: Account) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:65 + // self.admin_only() + callsub admin_only + // smart_contracts/asset_labeling/contract.py:66 + // self.admin = new_admin + bytec 4 // "admin" + frame_dig -1 + app_global_put + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.add_label(id: bytes, name: bytes) -> void: +add_label: + // smart_contracts/asset_labeling/contract.py:68-69 + // @abimethod() + // def add_label(self, id: String, name: String) -> None: + proto 2 0 + // smart_contracts/asset_labeling/contract.py:70 + // self.admin_only() + callsub admin_only + // smart_contracts/asset_labeling/contract.py:71 + // ensure(id not in self.labels, S("ERR:EXISTS")) + frame_dig -2 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bz add_label_after_if_else@3 + // smart_contracts/asset_labeling/contract.py:71 + // ensure(id not in self.labels, S("ERR:EXISTS")) + bytec 5 // "ERR:EXISTS" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +add_label_after_if_else@3: + // smart_contracts/asset_labeling/contract.py:72 + // ensure(id.bytes.length == 2, S("ERR:LENGTH")) + frame_dig -2 + len + intc_2 // 2 + == + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz add_label_after_if_else@7 + // smart_contracts/asset_labeling/contract.py:72 + // ensure(id.bytes.length == 2, S("ERR:LENGTH")) + bytec 8 // "ERR:LENGTH" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +add_label_after_if_else@7: + // smart_contracts/asset_labeling/contract.py:74 + // arc4.String(name), + frame_dig -1 + len + itob + extract 6 2 + frame_dig -1 + concat + // smart_contracts/asset_labeling/contract.py:73-77 + // self.labels[id] = LabelDescriptor( + // arc4.String(name), + // arc4.UInt64(0), + // arc4.UInt64(0), + // ) + pushbytes 0x001200000000000000000000000000000000 + swap + concat + frame_dig -2 + box_del + pop + frame_dig -2 + swap + box_put + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.remove_label(id: bytes) -> void: +remove_label: + // smart_contracts/asset_labeling/contract.py:79-80 + // @abimethod() + // def remove_label(self, id: String) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:81 + // self.admin_only() + callsub admin_only + // smart_contracts/asset_labeling/contract.py:82 + // ensure(id in self.labels, S("ERR:NOEXIST")) + frame_dig -1 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_label_after_if_else@3 + // smart_contracts/asset_labeling/contract.py:82 + // ensure(id in self.labels, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_label_after_if_else@3: + // smart_contracts/asset_labeling/contract.py:83 + // ensure(id.bytes.length == 2, S("ERR:LENGTH")) + frame_dig -1 + len + intc_2 // 2 + == + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_label_after_if_else@7 + // smart_contracts/asset_labeling/contract.py:83 + // ensure(id.bytes.length == 2, S("ERR:LENGTH")) + bytec 8 // "ERR:LENGTH" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_label_after_if_else@7: + // smart_contracts/asset_labeling/contract.py:84 + // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) + frame_dig -1 + box_get + assert // check self.labels entry exists + extract 2 8 // on error: Index access is out of bounds + bytec 9 // 0x0000000000000000 + b== + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_label_after_if_else@11 + // smart_contracts/asset_labeling/contract.py:84 + // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) + bytec 10 // "ERR:NOEMPTY" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_label_after_if_else@11: + // smart_contracts/asset_labeling/contract.py:85 + // del self.labels[id] + frame_dig -1 + box_del + pop + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_label(id: bytes) -> bytes: +get_label: + // smart_contracts/asset_labeling/contract.py:87-88 + // @abimethod(readonly=True) + // def get_label(self, id: String) -> LabelDescriptor: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:89 + // ensure(id in self.labels, S("ERR:NOEXIST")) + frame_dig -1 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz get_label_after_if_else@3 + // smart_contracts/asset_labeling/contract.py:89 + // ensure(id in self.labels, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +get_label_after_if_else@3: + // smart_contracts/asset_labeling/contract.py:90 + // return self.labels[id] + frame_dig -1 + box_get + assert // check self.labels entry exists + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.log_labels(ids: bytes) -> void: +log_labels: + // smart_contracts/asset_labeling/contract.py:92-93 + // @abimethod(readonly=True) + // def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:94 + // for _idx, label_id in uenumerate(ids): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +log_labels_for_header@1: + // smart_contracts/asset_labeling/contract.py:94 + // for _idx, label_id in uenumerate(ids): + frame_dig 1 + frame_dig 0 + < + bz log_labels_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_2 // 2 + * + dig 1 + swap + extract_uint16 + dup2 + extract_uint16 + intc_2 // 2 + + + extract3 + // smart_contracts/asset_labeling/contract.py:95 + // log(self.labels[label_id.native]) + extract 2 0 + box_get + assert // check self.labels entry exists + log + intc_0 // 1 + + + frame_bury 1 + b log_labels_for_header@1 + +log_labels_after_for@4: + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only(label: bytes) -> void: +admin_or_operator_only: + // smart_contracts/asset_labeling/contract.py:99-100 + // @subroutine + // def admin_or_operator_only(self, label: String) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:101 + // if Txn.sender == self.admin: + txn Sender + intc_1 // 0 + bytec 4 // "admin" + app_global_get_ex + assert // check self.admin exists + == + bz admin_or_operator_only_after_if_else@2 + // smart_contracts/asset_labeling/contract.py:102 + // return + retsub + +admin_or_operator_only_after_if_else@2: + // smart_contracts/asset_labeling/contract.py:103 + // self.operator_only(label) + frame_dig -1 + callsub operator_only + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.operator_only(label: bytes) -> void: +operator_only: + // smart_contracts/asset_labeling/contract.py:105-106 + // @subroutine + // def operator_only(self, label: String) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:108 + // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) + txn Sender + frame_dig -1 + callsub get_operator_label_index + intc 5 // 4294967296 + != + // smart_contracts/asset_labeling/contract.py:108-110 + // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) + // and self.get_operator_label_index(Txn.sender, label) + // != UInt64(NOT_FOUND_VALUE), + bz operator_only_bool_false@3 + // smart_contracts/asset_labeling/contract.py:109 + // and self.get_operator_label_index(Txn.sender, label) + txn Sender + frame_dig -1 + callsub get_operator_label_index + // smart_contracts/asset_labeling/contract.py:110 + // != UInt64(NOT_FOUND_VALUE), + intc 4 // 4294967295 + // smart_contracts/asset_labeling/contract.py:109-110 + // and self.get_operator_label_index(Txn.sender, label) + // != UInt64(NOT_FOUND_VALUE), + != + // smart_contracts/asset_labeling/contract.py:108-110 + // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) + // and self.get_operator_label_index(Txn.sender, label) + // != UInt64(NOT_FOUND_VALUE), + bz operator_only_bool_false@3 + intc_0 // 1 + +operator_only_bool_merge@4: + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz operator_only_after_if_else@7 + // smart_contracts/asset_labeling/contract.py:111 + // S("ERR:UNAUTH"), + bytec 7 // "ERR:UNAUTH" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +operator_only_after_if_else@7: + retsub + +operator_only_bool_false@3: + intc_1 // 0 + b operator_only_bool_merge@4 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index(operator: bytes, label: bytes) -> uint64: +get_operator_label_index: + // smart_contracts/asset_labeling/contract.py:114-115 + // @subroutine + // def get_operator_label_index(self, operator: Account, label: String) -> UInt64: + proto 2 1 + intc_1 // 0 + bytec_3 // "" + dup + // smart_contracts/asset_labeling/contract.py:116 + // if operator not in self.operators: + frame_dig -2 + box_len + bury 1 + bnz get_operator_label_index_after_if_else@2 + // smart_contracts/asset_labeling/contract.py:117 + // return UInt64(NOT_FOUND_KEY) + intc 5 // 4294967296 + frame_bury 0 + retsub + +get_operator_label_index_after_if_else@2: + // smart_contracts/asset_labeling/contract.py:118 + // for idx, stored_label in uenumerate(self.operators[operator]): + frame_dig -2 + box_get + swap + dup + cover 2 + frame_bury 0 + assert // check self.operators entry exists + intc_1 // 0 + extract_uint16 + frame_bury 1 + intc_1 // 0 + frame_bury 2 + +get_operator_label_index_for_header@3: + // smart_contracts/asset_labeling/contract.py:118 + // for idx, stored_label in uenumerate(self.operators[operator]): + frame_dig 2 + frame_dig 1 + < + bz get_operator_label_index_after_for@8 + frame_dig 0 + extract 2 0 + frame_dig 2 + intc_2 // 2 + * + dig 1 + swap + extract_uint16 + dup2 + extract_uint16 + intc_2 // 2 + + + extract3 + // smart_contracts/asset_labeling/contract.py:119 + // if stored_label == label: + extract 2 0 + frame_dig -1 + == + bz get_operator_label_index_after_if_else@6 + // smart_contracts/asset_labeling/contract.py:120 + // return idx + frame_dig 2 + frame_bury 0 + retsub + +get_operator_label_index_after_if_else@6: + frame_dig 2 + intc_0 // 1 + + + frame_bury 2 + b get_operator_label_index_for_header@3 + +get_operator_label_index_after_for@8: + // smart_contracts/asset_labeling/contract.py:121 + // return UInt64(NOT_FOUND_VALUE) + intc 4 // 4294967295 + frame_bury 0 + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label(operator: bytes, label: bytes) -> void: +add_operator_to_label: + // smart_contracts/asset_labeling/contract.py:123-124 + // @abimethod() + // def add_operator_to_label(self, operator: Account, label: String) -> None: + proto 2 0 + // smart_contracts/asset_labeling/contract.py:125 + // self.admin_or_operator_only(label) + frame_dig -1 + callsub admin_or_operator_only + // smart_contracts/asset_labeling/contract.py:126 + // ensure(label in self.labels, S("ERR:NOEXIST")) + frame_dig -1 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz add_operator_to_label_after_if_else@10 + // smart_contracts/asset_labeling/contract.py:126 + // ensure(label in self.labels, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +add_operator_to_label_after_if_else@10: + // smart_contracts/asset_labeling/contract.py:127-128 + // # check if operator exists already + // if operator in self.operators: + frame_dig -2 + box_len + bury 1 + bz add_operator_to_label_else_body@2 + // smart_contracts/asset_labeling/contract.py:131 + // self.get_operator_label_index(operator, label) + frame_dig -2 + frame_dig -1 + callsub get_operator_label_index + // smart_contracts/asset_labeling/contract.py:132 + // == UInt64(NOT_FOUND_VALUE), + intc 4 // 4294967295 + // smart_contracts/asset_labeling/contract.py:131-132 + // self.get_operator_label_index(operator, label) + // == UInt64(NOT_FOUND_VALUE), + == + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz add_operator_to_label_after_if_else@6 + // smart_contracts/asset_labeling/contract.py:133 + // S("ERR:EXISTS"), + bytec 5 // "ERR:EXISTS" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +add_operator_to_label_after_if_else@6: + // smart_contracts/asset_labeling/contract.py:136-137 + // # add label to operator + // existing = self.operators[operator].copy() + frame_dig -2 + box_get + assert // check self.operators entry exists + // smart_contracts/asset_labeling/contract.py:138 + // existing.append(arc4.String(label)) + frame_dig -1 + len + itob + extract 6 2 + frame_dig -1 + concat + intc_0 // 1 + callsub dynamic_array_concat_byte_length_head + // smart_contracts/asset_labeling/contract.py:139 + // self.operators[operator] = existing.copy() + frame_dig -2 + box_del + pop + frame_dig -2 + swap + box_put + +add_operator_to_label_after_if_else@3: + // smart_contracts/asset_labeling/contract.py:144-145 + // # increment label operators + // label_descriptor = self.labels[label].copy() + frame_dig -1 + box_get + assert // check self.labels entry exists + // smart_contracts/asset_labeling/contract.py:147 + // label_descriptor.num_operators.native + UInt64(1) + dup + pushint 10 // 10 + extract_uint64 + intc_0 // 1 + + + // smart_contracts/asset_labeling/contract.py:146-148 + // label_descriptor.num_operators = arc4.UInt64( + // label_descriptor.num_operators.native + UInt64(1) + // ) + itob + replace2 10 + // smart_contracts/asset_labeling/contract.py:149 + // self.labels[label] = label_descriptor.copy() + frame_dig -1 + box_del + pop + frame_dig -1 + swap + box_put + retsub + +add_operator_to_label_else_body@2: + // smart_contracts/asset_labeling/contract.py:141-142 + // # new operator, create new box + // self.operators[operator] = arc4.DynamicArray(arc4.String(label)) + frame_dig -1 + len + itob + extract 6 2 + frame_dig -1 + concat + bytec 6 // 0x0002 + swap + concat + bytec 11 // 0x0001 + swap + concat + frame_dig -2 + box_del + pop + frame_dig -2 + swap + box_put + b add_operator_to_label_after_if_else@3 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label(operator: bytes, label: bytes) -> void: +remove_operator_from_label: + // smart_contracts/asset_labeling/contract.py:151-152 + // @abimethod() + // def remove_operator_from_label(self, operator: Account, label: String) -> None: + proto 2 0 + intc_1 // 0 + dupn 4 + bytec_3 // "" + dupn 2 + // smart_contracts/asset_labeling/contract.py:153 + // self.admin_or_operator_only(label) + frame_dig -1 + callsub admin_or_operator_only + // smart_contracts/asset_labeling/contract.py:155 + // ensure(label in self.labels, S("ERR:NOEXIST")) + frame_dig -1 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_operator_from_label_after_if_else@28 + // smart_contracts/asset_labeling/contract.py:155 + // ensure(label in self.labels, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_operator_from_label_after_if_else@28: + // smart_contracts/asset_labeling/contract.py:156 + // ensure(operator in self.operators, S("ERR:NOEXIST")) + frame_dig -2 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_operator_from_label_after_if_else@32 + // smart_contracts/asset_labeling/contract.py:156 + // ensure(operator in self.operators, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_operator_from_label_after_if_else@32: + // smart_contracts/asset_labeling/contract.py:158-159 + // # ensure label exists in operator + // label_idx = self.get_operator_label_index(operator, label) + frame_dig -2 + frame_dig -1 + callsub get_operator_label_index + dup + frame_bury 7 + // smart_contracts/asset_labeling/contract.py:161 + // label_idx != UInt64(NOT_FOUND_VALUE) + intc 4 // 4294967295 + != + // smart_contracts/asset_labeling/contract.py:161-163 + // label_idx != UInt64(NOT_FOUND_VALUE) + // and label_idx + // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above + bz remove_operator_from_label_bool_false@3 + // smart_contracts/asset_labeling/contract.py:162-163 + // and label_idx + // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above + frame_dig 7 + // smart_contracts/asset_labeling/contract.py:163 + // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above + intc 5 // 4294967296 + // smart_contracts/asset_labeling/contract.py:162-163 + // and label_idx + // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above + != + // smart_contracts/asset_labeling/contract.py:161-163 + // label_idx != UInt64(NOT_FOUND_VALUE) + // and label_idx + // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above + bz remove_operator_from_label_bool_false@3 + intc_0 // 1 + +remove_operator_from_label_bool_merge@4: + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_operator_from_label_after_if_else@24 + // smart_contracts/asset_labeling/contract.py:164 + // S("ERR:NOEXIST"), + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_operator_from_label_after_if_else@24: + // smart_contracts/asset_labeling/contract.py:167-168 + // # ensure only empty labels can be left operator-less + // label_descriptor = self.labels[label].copy() + frame_dig -1 + box_get + swap + dup + cover 2 + frame_bury 0 + assert // check self.labels entry exists + // smart_contracts/asset_labeling/contract.py:170 + // label_descriptor.num_operators > 1 or label_descriptor.num_assets == 0, + extract 10 8 // on error: Index access is out of bounds + pushbytes 0x0000000000000001 + b> + bnz remove_operator_from_label_bool_true@6 + frame_dig 0 + extract 2 8 // on error: Index access is out of bounds + bytec 9 // 0x0000000000000000 + b== + bz remove_operator_from_label_bool_false@7 + +remove_operator_from_label_bool_true@6: + intc_0 // 1 + +remove_operator_from_label_bool_merge@8: + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_operator_from_label_after_if_else@20 + // smart_contracts/asset_labeling/contract.py:171 + // S("ERR:NOEMPTY"), + bytec 10 // "ERR:NOEMPTY" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_operator_from_label_after_if_else@20: + // smart_contracts/asset_labeling/contract.py:175 + // label_descriptor.num_operators.native - UInt64(1) + frame_dig 0 + dup + pushint 10 // 10 + extract_uint64 + intc_0 // 1 + - + // smart_contracts/asset_labeling/contract.py:173-176 + // # decr operator count + // label_descriptor.num_operators = arc4.UInt64( + // label_descriptor.num_operators.native - UInt64(1) + // ) + itob + replace2 10 + // smart_contracts/asset_labeling/contract.py:177 + // self.labels[label] = label_descriptor.copy() + frame_dig -1 + box_del + pop + frame_dig -1 + swap + box_put + // smart_contracts/asset_labeling/contract.py:179 + // if self.operators[operator].length == 1: + frame_dig -2 + box_get + assert // check self.operators entry exists + intc_1 // 0 + extract_uint16 + intc_0 // 1 + == + bz remove_operator_from_label_else_body@10 + // smart_contracts/asset_labeling/contract.py:180 + // del self.operators[operator] + frame_dig -2 + box_del + pop + retsub + +remove_operator_from_label_else_body@10: + // smart_contracts/asset_labeling/contract.py:182 + // next_list = arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + frame_bury 2 + // smart_contracts/asset_labeling/contract.py:183-186 + // # walk, push everything except index + // # this implementation walks twice (once in get_operator_label_index) + // # could be more efficient + // for idx, stored_label in uenumerate(self.operators[operator]): + frame_dig -2 + box_get + swap + dup + cover 2 + frame_bury 1 + assert // check self.operators entry exists + intc_1 // 0 + extract_uint16 + frame_bury 5 + intc_1 // 0 + frame_bury 6 + +remove_operator_from_label_for_header@11: + // smart_contracts/asset_labeling/contract.py:183-186 + // # walk, push everything except index + // # this implementation walks twice (once in get_operator_label_index) + // # could be more efficient + // for idx, stored_label in uenumerate(self.operators[operator]): + frame_dig 6 + frame_dig 5 + < + bz remove_operator_from_label_after_for@16 + frame_dig 1 + extract 2 0 + frame_dig 6 + dup + cover 2 + intc_2 // 2 + * + dig 1 + swap + extract_uint16 + dup2 + extract_uint16 + intc_2 // 2 + + + extract3 + frame_bury 4 + // smart_contracts/asset_labeling/contract.py:187 + // if label_idx != idx: + frame_dig 7 + != + frame_dig 2 + frame_bury 3 + bz remove_operator_from_label_after_if_else@14 + // smart_contracts/asset_labeling/contract.py:188 + // next_list.append(stored_label) + frame_dig 2 + frame_dig 4 + intc_0 // 1 + callsub dynamic_array_concat_byte_length_head + frame_bury 3 + +remove_operator_from_label_after_if_else@14: + frame_dig 3 + frame_bury 2 + frame_dig 6 + intc_0 // 1 + + + frame_bury 6 + b remove_operator_from_label_for_header@11 + +remove_operator_from_label_after_for@16: + // smart_contracts/asset_labeling/contract.py:190 + // self.operators[operator] = next_list.copy() + frame_dig -2 + box_del + pop + frame_dig -2 + frame_dig 2 + box_put + retsub + +remove_operator_from_label_bool_false@7: + intc_1 // 0 + b remove_operator_from_label_bool_merge@8 + +remove_operator_from_label_bool_false@3: + intc_1 // 0 + b remove_operator_from_label_bool_merge@4 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels(operator: bytes) -> bytes: +get_operator_labels: + // smart_contracts/asset_labeling/contract.py:192-193 + // @abimethod(readonly=True) + // def get_operator_labels(self, operator: Account) -> LabelList: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:194 + // if operator in self.operators: + frame_dig -1 + box_len + bury 1 + bz get_operator_labels_after_if_else@2 + // smart_contracts/asset_labeling/contract.py:195 + // return self.operators[operator] + frame_dig -1 + box_get + assert // check self.operators entry exists + retsub + +get_operator_labels_after_if_else@2: + // smart_contracts/asset_labeling/contract.py:43 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + // smart_contracts/asset_labeling/contract.py:196-197 + // # return empty list + // return empty_list() + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset(label: bytes, asset: uint64) -> void: +add_label_to_asset: + // smart_contracts/asset_labeling/contract.py:208-209 + // @abimethod() + // def add_label_to_asset(self, label: String, asset: Asset) -> None: + proto 2 0 + intc_1 // 0 + dup + bytec_3 // "" + dup + // smart_contracts/asset_labeling/contract.py:210 + // ensure(label in self.labels, S("ERR:NOEXIST")) + frame_dig -2 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz add_label_to_asset_after_if_else@19 + // smart_contracts/asset_labeling/contract.py:210 + // ensure(label in self.labels, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +add_label_to_asset_after_if_else@19: + // smart_contracts/asset_labeling/contract.py:212 + // self.operator_only(label) + frame_dig -2 + callsub operator_only + // smart_contracts/asset_labeling/contract.py:214 + // if asset in self.assets: + frame_dig -1 + itob + dup + frame_bury 1 + box_len + bury 1 + bz add_label_to_asset_else_body@2 + // smart_contracts/asset_labeling/contract.py:201 + // if asset not in self.assets: + frame_dig 1 + box_len + bury 1 + bnz add_label_to_asset_after_if_else@6 + // smart_contracts/asset_labeling/contract.py:202 + // return UInt64(NOT_FOUND_KEY) + intc 5 // 4294967296 + +add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12: + // smart_contracts/asset_labeling/contract.py:217 + // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), + intc 4 // 4294967295 + == + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz add_label_to_asset_after_if_else@15 + // smart_contracts/asset_labeling/contract.py:218 + // S("ERR:EXISTS"), + bytec 5 // "ERR:EXISTS" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +add_label_to_asset_after_if_else@15: + // smart_contracts/asset_labeling/contract.py:221-222 + // # add label to operator + // existing = self.assets[asset].copy() + frame_dig 1 + dup + box_get + assert // check self.assets entry exists + // smart_contracts/asset_labeling/contract.py:223 + // existing.append(arc4.String(label)) + frame_dig -2 + len + itob + extract 6 2 + frame_dig -2 + concat + intc_0 // 1 + callsub dynamic_array_concat_byte_length_head + // smart_contracts/asset_labeling/contract.py:224 + // self.assets[asset] = existing.copy() + dig 1 + box_del + pop + box_put + +add_label_to_asset_after_if_else@3: + // smart_contracts/asset_labeling/contract.py:229-230 + // # incr asset count + // label_descriptor = self.labels[label].copy() + frame_dig -2 + box_get + assert // check self.labels entry exists + // smart_contracts/asset_labeling/contract.py:232 + // label_descriptor.num_assets.native + UInt64(1) + dup + intc_2 // 2 + extract_uint64 + intc_0 // 1 + + + // smart_contracts/asset_labeling/contract.py:231-233 + // label_descriptor.num_assets = arc4.UInt64( + // label_descriptor.num_assets.native + UInt64(1) + // ) + itob + replace2 2 + // smart_contracts/asset_labeling/contract.py:234 + // self.labels[label] = label_descriptor.copy() + frame_dig -2 + box_del + pop + frame_dig -2 + swap + box_put + retsub + +add_label_to_asset_after_if_else@6: + // smart_contracts/asset_labeling/contract.py:203 + // for idx, stored_label in uenumerate(self.assets[asset]): + frame_dig 1 + box_get + swap + dup + cover 2 + frame_bury 0 + assert // check self.assets entry exists + intc_1 // 0 + extract_uint16 + frame_bury 2 + intc_1 // 0 + frame_bury 3 + +add_label_to_asset_for_header@7: + // smart_contracts/asset_labeling/contract.py:203 + // for idx, stored_label in uenumerate(self.assets[asset]): + frame_dig 3 + frame_dig 2 + < + bz add_label_to_asset_after_for@11 + frame_dig 0 + extract 2 0 + frame_dig 3 + intc_2 // 2 + * + dig 1 + swap + extract_uint16 + dup2 + extract_uint16 + intc_2 // 2 + + + extract3 + // smart_contracts/asset_labeling/contract.py:204 + // if stored_label == label: + extract 2 0 + frame_dig -2 + == + bz add_label_to_asset_after_if_else@10 + frame_dig 3 + // smart_contracts/asset_labeling/contract.py:217 + // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), + b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 + +add_label_to_asset_after_if_else@10: + frame_dig 3 + intc_0 // 1 + + + frame_bury 3 + b add_label_to_asset_for_header@7 + +add_label_to_asset_after_for@11: + // smart_contracts/asset_labeling/contract.py:206 + // return UInt64(NOT_FOUND_VALUE) + intc 4 // 4294967295 + // smart_contracts/asset_labeling/contract.py:217 + // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), + b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 + +add_label_to_asset_else_body@2: + // smart_contracts/asset_labeling/contract.py:226-227 + // # new operator, create new box + // self.assets[asset] = arc4.DynamicArray(arc4.String(label)) + frame_dig -2 + len + itob + extract 6 2 + frame_dig -2 + concat + bytec 6 // 0x0002 + swap + concat + bytec 11 // 0x0001 + swap + concat + frame_dig 1 + dup + box_del + pop + swap + box_put + b add_label_to_asset_after_if_else@3 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset(label: bytes, asset: uint64) -> void: +remove_label_from_asset: + // smart_contracts/asset_labeling/contract.py:236-237 + // @abimethod() + // def remove_label_from_asset(self, label: String, asset: Asset) -> None: + proto 2 0 + intc_1 // 0 + dupn 3 + bytec_3 // "" + dupn 2 + // smart_contracts/asset_labeling/contract.py:238 + // ensure(label in self.labels, S("ERR:NOEXIST")) + frame_dig -2 + box_len + bury 1 + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + bnz remove_label_from_asset_after_if_else@20 + // smart_contracts/asset_labeling/contract.py:238 + // ensure(label in self.labels, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_label_from_asset_after_if_else@20: + // smart_contracts/asset_labeling/contract.py:240 + // self.operator_only(label) + frame_dig -2 + callsub operator_only + // smart_contracts/asset_labeling/contract.py:242 + // found = False + intc_1 // 0 + frame_bury 5 + // smart_contracts/asset_labeling/contract.py:243 + // if self.assets[asset].length == 1: + frame_dig -1 + itob + dup + frame_bury 3 + box_get + assert // check self.assets entry exists + intc_1 // 0 + extract_uint16 + intc_0 // 1 + == + bz remove_label_from_asset_else_body@5 + // smart_contracts/asset_labeling/contract.py:244 + // if self.assets[asset][0] == label: + frame_dig 3 + box_get + assert // check self.assets entry exists + dup + extract 2 0 + swap + intc_1 // 0 + extract_uint16 + assert // Index access is out of bounds + dup + intc_1 // 0 + extract_uint16 + dup2 + extract_uint16 + intc_2 // 2 + + + extract3 + extract 2 0 + frame_dig -2 + == + bz remove_label_from_asset_else_body@3 + // smart_contracts/asset_labeling/contract.py:245 + // del self.assets[asset] + frame_dig 3 + box_del + pop + // smart_contracts/asset_labeling/contract.py:246 + // found = True + intc_0 // 1 + frame_bury 5 + +remove_label_from_asset_after_if_else@13: + // smart_contracts/asset_labeling/contract.py:36 + // if not cond: + frame_dig 5 + bnz remove_label_from_asset_after_if_else@16 + // smart_contracts/asset_labeling/contract.py:261 + // ensure(found, S("ERR:NOEXIST")) + bytec_1 // "ERR:NOEXIST" + // smart_contracts/asset_labeling/contract.py:37 + // log(msg) + log + // smart_contracts/asset_labeling/contract.py:38 + // op.err() + err + +remove_label_from_asset_after_if_else@16: + // smart_contracts/asset_labeling/contract.py:263-264 + // # decr asset count + // label_descriptor = self.labels[label].copy() + frame_dig -2 + box_get + assert // check self.labels entry exists + // smart_contracts/asset_labeling/contract.py:266 + // label_descriptor.num_assets.native - UInt64(1) + dup + intc_2 // 2 + extract_uint64 + intc_0 // 1 + - + // smart_contracts/asset_labeling/contract.py:265-267 + // label_descriptor.num_assets = arc4.UInt64( + // label_descriptor.num_assets.native - UInt64(1) + // ) + itob + replace2 2 + // smart_contracts/asset_labeling/contract.py:268 + // self.labels[label] = label_descriptor.copy() + frame_dig -2 + box_del + pop + frame_dig -2 + swap + box_put + retsub + +remove_label_from_asset_else_body@3: + // smart_contracts/asset_labeling/contract.py:248 + // found = False + intc_1 // 0 + frame_bury 5 + b remove_label_from_asset_after_if_else@13 + +remove_label_from_asset_else_body@5: + // smart_contracts/asset_labeling/contract.py:250 + // next_list = arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + frame_bury 1 + // smart_contracts/asset_labeling/contract.py:251-253 + // # walk, push everything to new box except label + // # save $found to throw if not found + // for idx, stored_label in uenumerate(self.assets[asset]): + frame_dig 3 + box_get + swap + dup + cover 2 + frame_bury 0 + assert // check self.assets entry exists + intc_1 // 0 + extract_uint16 + frame_bury 4 + intc_1 // 0 + frame_bury 6 + +remove_label_from_asset_for_header@6: + // smart_contracts/asset_labeling/contract.py:251-253 + // # walk, push everything to new box except label + // # save $found to throw if not found + // for idx, stored_label in uenumerate(self.assets[asset]): + frame_dig 6 + frame_dig 4 + < + bz remove_label_from_asset_after_for@12 + frame_dig 0 + extract 2 0 + frame_dig 6 + intc_2 // 2 + * + dig 1 + swap + extract_uint16 + dup2 + extract_uint16 + intc_2 // 2 + + + extract3 + dup + frame_bury 2 + // smart_contracts/asset_labeling/contract.py:254 + // if stored_label != label: + extract 2 0 + frame_dig -2 + != + bz remove_label_from_asset_else_body@9 + // smart_contracts/asset_labeling/contract.py:255 + // next_list.append(stored_label) + frame_dig 1 + frame_dig 2 + intc_0 // 1 + callsub dynamic_array_concat_byte_length_head + frame_bury 1 + +remove_label_from_asset_after_if_else@10: + frame_dig 6 + intc_0 // 1 + + + frame_bury 6 + b remove_label_from_asset_for_header@6 + +remove_label_from_asset_else_body@9: + // smart_contracts/asset_labeling/contract.py:257 + // found = True + intc_0 // 1 + frame_bury 5 + b remove_label_from_asset_after_if_else@10 + +remove_label_from_asset_after_for@12: + // smart_contracts/asset_labeling/contract.py:259 + // self.assets[asset] = next_list.copy() + frame_dig 3 + dup + box_del + pop + frame_dig 1 + box_put + b remove_label_from_asset_after_if_else@13 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels(asset: uint64) -> bytes: +get_asset_labels: + // smart_contracts/asset_labeling/contract.py:270-271 + // @abimethod(readonly=True) + // def get_asset_labels(self, asset: Asset) -> LabelList: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:272 + // if asset in self.assets: + frame_dig -1 + itob + dup + box_len + bury 1 + bz get_asset_labels_after_if_else@2 + // smart_contracts/asset_labeling/contract.py:273 + // return self.assets[asset] + frame_dig 0 + box_get + assert // check self.assets entry exists + swap + retsub + +get_asset_labels_after_if_else@2: + // smart_contracts/asset_labeling/contract.py:43 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + // smart_contracts/asset_labeling/contract.py:274-275 + // # return empty + // return empty_list() + swap + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels(assets: bytes) -> bytes: +get_assets_labels: + // smart_contracts/asset_labeling/contract.py:277-280 + // @abimethod(readonly=True) + // def get_assets_labels( + // self, assets: arc4.DynamicArray[arc4.UInt64] + // ) -> arc4.DynamicArray[LabelList]: + proto 1 1 + intc_1 // 0 + // smart_contracts/asset_labeling/contract.py:281 + // out = arc4.DynamicArray[LabelList]() + bytec_2 // 0x0000 + // smart_contracts/asset_labeling/contract.py:282 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_labels_for_header@1: + // smart_contracts/asset_labeling/contract.py:282 + // for _i, asset_id in uenumerate(assets): + frame_dig 3 + frame_dig 2 + < + bz get_assets_labels_after_for@7 + frame_dig -1 + extract 2 0 + frame_dig 3 + intc_3 // 8 + * + // smart_contracts/asset_labeling/contract.py:283 + // asset = Asset(asset_id.native) + extract_uint64 + // smart_contracts/asset_labeling/contract.py:284 + // if asset in self.assets: + itob + dup + frame_bury 0 + box_len + bury 1 + bz get_assets_labels_else_body@4 + // smart_contracts/asset_labeling/contract.py:285 + // out.append(self.assets[asset].copy()) + frame_dig 0 + box_get + assert // check self.assets entry exists + bytec 6 // 0x0002 + swap + concat + frame_dig 1 + dup + intc_1 // 0 + extract_uint16 + swap + extract 2 0 + intc_0 // 1 + uncover 3 + callsub dynamic_array_concat_dynamic_element + frame_bury 1 + +get_assets_labels_after_if_else@5: + frame_dig 3 + intc_0 // 1 + + + frame_bury 3 + b get_assets_labels_for_header@1 + +get_assets_labels_else_body@4: + // smart_contracts/asset_labeling/contract.py:287 + // out.append(empty_list()) + frame_dig 1 + dup + intc_1 // 0 + extract_uint16 + swap + extract 2 0 + intc_0 // 1 + pushbytes 0x00020000 + callsub dynamic_array_concat_dynamic_element + frame_bury 1 + b get_assets_labels_after_if_else@5 + +get_assets_labels_after_for@7: + // smart_contracts/asset_labeling/contract.py:288 + // return out + frame_dig 1 + frame_bury 0 + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro(asset_id: uint64) -> bytes: +_get_asset_micro: + // smart_contracts/asset_labeling/contract.py:296-297 + // @subroutine + // def _get_asset_micro(self, asset_id: UInt64) -> AssetMicro: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:300 + // unit_name=b2str(asset.unit_name), + frame_dig -1 + asset_params_get AssetUnitName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:301 + // decimals=arc4.UInt8(asset.decimals), + frame_dig -1 + asset_params_get AssetDecimals + assert // asset exists + itob + dup + bitlen + intc_3 // 8 + <= + assert // overflow + extract 7 1 + // smart_contracts/asset_labeling/contract.py:299-302 + // return AssetMicro( + // unit_name=b2str(asset.unit_name), + // decimals=arc4.UInt8(asset.decimals), + // ) + pushbytes 0x0003 + swap + concat + swap + concat + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro(asset: uint64) -> bytes: +get_asset_micro: + // smart_contracts/asset_labeling/contract.py:304-305 + // @abimethod(readonly=True) + // def get_asset_micro(self, asset: UInt64) -> AssetMicro: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:306 + // return self._get_asset_micro(asset) + frame_dig -1 + callsub _get_asset_micro + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro(assets: bytes) -> void: +get_assets_micro: + // smart_contracts/asset_labeling/contract.py:308-309 + // @abimethod(readonly=True) + // def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:310 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_micro_for_header@1: + // smart_contracts/asset_labeling/contract.py:310 + // for _i, asset_id in uenumerate(assets): + frame_dig 1 + frame_dig 0 + < + bz get_assets_micro_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_3 // 8 + * + // smart_contracts/asset_labeling/contract.py:311 + // log(self._get_asset_micro(asset_id.native)) + extract_uint64 + callsub _get_asset_micro + log + intc_0 // 1 + + + frame_bury 1 + b get_assets_micro_for_header@1 + +get_assets_micro_after_for@4: + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels(asset_id: uint64) -> bytes: +_get_asset_micro_labels: + // smart_contracts/asset_labeling/contract.py:315-316 + // @subroutine + // def _get_asset_micro_labels(self, asset_id: UInt64) -> AssetMicroLabels: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:319 + // unit_name=b2str(asset.unit_name), + frame_dig -1 + asset_params_get AssetUnitName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:320 + // decimals=arc4.UInt8(asset.decimals), + frame_dig -1 + asset_params_get AssetDecimals + assert // asset exists + itob + dup + bitlen + intc_3 // 8 + <= + assert // overflow + extract 7 1 + // smart_contracts/asset_labeling/contract.py:321 + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + frame_dig -1 + itob + dup + box_len + bury 1 + bz _get_asset_micro_labels_ternary_false@2 + frame_dig 2 + box_get + assert // check self.assets entry exists + +_get_asset_micro_labels_ternary_merge@3: + // smart_contracts/asset_labeling/contract.py:318-322 + // return AssetMicroLabels( + // unit_name=b2str(asset.unit_name), + // decimals=arc4.UInt8(asset.decimals), + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + // ) + frame_dig 0 + dup + len + pushint 5 // 5 + + + pushbytes 0x0005 + frame_dig 1 + concat + swap + itob + extract 6 2 + concat + swap + concat + swap + concat + frame_bury 0 + retsub + +_get_asset_micro_labels_ternary_false@2: + // smart_contracts/asset_labeling/contract.py:43 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + b _get_asset_micro_labels_ternary_merge@3 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro_labels(asset: uint64) -> bytes: +get_asset_micro_labels: + // smart_contracts/asset_labeling/contract.py:324-325 + // @abimethod(readonly=True) + // def get_asset_micro_labels(self, asset: UInt64) -> AssetMicroLabels: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:326 + // return self._get_asset_micro_labels(asset) + frame_dig -1 + callsub _get_asset_micro_labels + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro_labels(assets: bytes) -> void: +get_assets_micro_labels: + // smart_contracts/asset_labeling/contract.py:328-329 + // @abimethod(readonly=True) + // def get_assets_micro_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:330 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_micro_labels_for_header@1: + // smart_contracts/asset_labeling/contract.py:330 + // for _i, asset_id in uenumerate(assets): + frame_dig 1 + frame_dig 0 + < + bz get_assets_micro_labels_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_3 // 8 + * + // smart_contracts/asset_labeling/contract.py:331 + // log(self._get_asset_micro_labels(asset_id.native)) + extract_uint64 + callsub _get_asset_micro_labels + log + intc_0 // 1 + + + frame_bury 1 + b get_assets_micro_labels_for_header@1 + +get_assets_micro_labels_after_for@4: + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text(asset_id: uint64) -> bytes: +_get_asset_text: + // smart_contracts/asset_labeling/contract.py:335-336 + // @subroutine + // def _get_asset_text(self, asset_id: UInt64) -> AssetText: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:339 + // name=b2str(asset.name), + frame_dig -1 + asset_params_get AssetName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:340 + // unit_name=b2str(asset.unit_name), + frame_dig -1 + asset_params_get AssetUnitName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:341 + // url=b2str(asset.url), + frame_dig -1 + asset_params_get AssetURL + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:342 + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + frame_dig -1 + itob + dup + box_len + bury 1 + bz _get_asset_text_ternary_false@2 + frame_dig 3 + box_get + assert // check self.assets entry exists + +_get_asset_text_ternary_merge@3: + // smart_contracts/asset_labeling/contract.py:338-343 + // return AssetText( + // name=b2str(asset.name), + // unit_name=b2str(asset.unit_name), + // url=b2str(asset.url), + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + // ) + frame_dig 0 + dup + len + intc_3 // 8 + + + dup + itob + extract 6 2 + pushbytes 0x0008 + swap + concat + frame_dig 1 + dup + cover 3 + len + uncover 2 + + + dup + itob + extract 6 2 + uncover 2 + swap + concat + frame_dig 2 + dup + cover 3 + len + uncover 2 + + + itob + extract 6 2 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + swap + concat + frame_bury 0 + retsub + +_get_asset_text_ternary_false@2: + // smart_contracts/asset_labeling/contract.py:43 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + b _get_asset_text_ternary_merge@3 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text(asset: uint64) -> bytes: +get_asset_text: + // smart_contracts/asset_labeling/contract.py:345-346 + // @abimethod(readonly=True) + // def get_asset_text(self, asset: UInt64) -> AssetText: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:347 + // return self._get_asset_text(asset) + frame_dig -1 + callsub _get_asset_text + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text(assets: bytes) -> void: +get_assets_text: + // smart_contracts/asset_labeling/contract.py:349-350 + // @abimethod(readonly=True) + // def get_assets_text(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:351 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_text_for_header@1: + // smart_contracts/asset_labeling/contract.py:351 + // for _i, asset_id in uenumerate(assets): + frame_dig 1 + frame_dig 0 + < + bz get_assets_text_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_3 // 8 + * + // smart_contracts/asset_labeling/contract.py:352 + // log(self._get_asset_text(asset_id.native)) + extract_uint64 + callsub _get_asset_text + log + intc_0 // 1 + + + frame_bury 1 + b get_assets_text_for_header@1 + +get_assets_text_after_for@4: + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small(asset_id: uint64) -> bytes: +_get_asset_small: + // smart_contracts/asset_labeling/contract.py:356-357 + // @subroutine + // def _get_asset_small(self, asset_id: UInt64) -> AssetSmall: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:360 + // name=b2str(asset.name), + frame_dig -1 + asset_params_get AssetName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:361 + // unit_name=b2str(asset.unit_name), + frame_dig -1 + asset_params_get AssetUnitName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:362 + // decimals=arc4.UInt8(asset.decimals), + frame_dig -1 + asset_params_get AssetDecimals + assert // asset exists + itob + dup + bitlen + intc_3 // 8 + <= + assert // overflow + extract 7 1 + // smart_contracts/asset_labeling/contract.py:363 + // total=arc4.UInt64(asset.total), + frame_dig -1 + asset_params_get AssetTotal + assert // asset exists + itob + // smart_contracts/asset_labeling/contract.py:364 + // has_freeze=arc4.Bool(asset.freeze != Global.zero_address), + frame_dig -1 + asset_params_get AssetFreeze + assert // asset exists + global ZeroAddress + != + pushbytes 0x00 + intc_1 // 0 + uncover 2 + setbit + // smart_contracts/asset_labeling/contract.py:365 + // has_clawback=arc4.Bool(asset.clawback != Global.zero_address), + frame_dig -1 + asset_params_get AssetClawback + assert // asset exists + global ZeroAddress + != + pushbytes 0x00 + intc_1 // 0 + uncover 2 + setbit + // smart_contracts/asset_labeling/contract.py:366 + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + frame_dig -1 + itob + dup + box_len + bury 1 + bz _get_asset_small_ternary_false@2 + frame_dig 6 + box_get + assert // check self.assets entry exists + +_get_asset_small_ternary_merge@3: + // smart_contracts/asset_labeling/contract.py:359-367 + // return AssetSmall( + // name=b2str(asset.name), + // unit_name=b2str(asset.unit_name), + // decimals=arc4.UInt8(asset.decimals), + // total=arc4.UInt64(asset.total), + // has_freeze=arc4.Bool(asset.freeze != Global.zero_address), + // has_clawback=arc4.Bool(asset.clawback != Global.zero_address), + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + // ) + frame_dig 0 + dup + len + pushint 16 // 16 + + + dup + itob + extract 6 2 + pushbytes 0x0010 + swap + concat + frame_dig 1 + dup + cover 3 + len + uncover 2 + + + swap + frame_dig 2 + concat + frame_dig 3 + concat + frame_dig 4 + concat + frame_dig 5 + intc_1 // 0 + getbit + pushint 105 // 105 + swap + setbit + swap + itob + extract 6 2 + concat + uncover 2 + concat + swap + concat + swap + concat + frame_bury 0 + retsub + +_get_asset_small_ternary_false@2: + // smart_contracts/asset_labeling/contract.py:43 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + b _get_asset_small_ternary_merge@3 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_small(asset: uint64) -> bytes: +get_asset_small: + // smart_contracts/asset_labeling/contract.py:369-370 + // @abimethod(readonly=True) + // def get_asset_small(self, asset: UInt64) -> AssetSmall: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:371 + // return self._get_asset_small(asset) + frame_dig -1 + callsub _get_asset_small + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_small(assets: bytes) -> void: +get_assets_small: + // smart_contracts/asset_labeling/contract.py:373-374 + // @abimethod(readonly=True) + // def get_assets_small(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:375 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_small_for_header@1: + // smart_contracts/asset_labeling/contract.py:375 + // for _i, asset_id in uenumerate(assets): + frame_dig 1 + frame_dig 0 + < + bz get_assets_small_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_3 // 8 + * + // smart_contracts/asset_labeling/contract.py:376 + // log(self._get_asset_small(asset_id.native)) + extract_uint64 + callsub _get_asset_small + log + intc_0 // 1 + + + frame_bury 1 + b get_assets_small_for_header@1 + +get_assets_small_after_for@4: + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full(asset_id: uint64) -> bytes: +_get_asset_full: + // smart_contracts/asset_labeling/contract.py:380-381 + // @subroutine + // def _get_asset_full(self, asset_id: UInt64) -> AssetFull: + proto 1 1 + intc_1 // 0 + dupn 11 + // smart_contracts/asset_labeling/contract.py:383 + // reserve_acct = Account(asset.reserve.bytes) + frame_dig -1 + asset_params_get AssetReserve + swap + dup + uncover 2 + assert // asset exists + // smart_contracts/asset_labeling/contract.py:386 + // if reserve_acct.is_opted_in(asset) + frame_dig -1 + asset_holding_get AssetBalance + bury 1 + // smart_contracts/asset_labeling/contract.py:385-387 + // asset.balance(reserve_acct) + // if reserve_acct.is_opted_in(asset) + // else UInt64(0) + bz _get_asset_full_ternary_false@2 + // smart_contracts/asset_labeling/contract.py:385 + // asset.balance(reserve_acct) + frame_dig 12 + frame_dig -1 + asset_holding_get AssetBalance + assert // account opted into asset + +_get_asset_full_ternary_merge@3: + // smart_contracts/asset_labeling/contract.py:390 + // name=b2str(asset.name), + frame_dig -1 + asset_params_get AssetName + assert // asset exists + callsub b2str + frame_bury 1 + // smart_contracts/asset_labeling/contract.py:391 + // unit_name=b2str(asset.unit_name), + frame_dig -1 + asset_params_get AssetUnitName + assert // asset exists + callsub b2str + frame_bury 2 + // smart_contracts/asset_labeling/contract.py:392 + // url=b2str(asset.url), + frame_dig -1 + asset_params_get AssetURL + assert // asset exists + callsub b2str + frame_bury 3 + // smart_contracts/asset_labeling/contract.py:393 + // total=arc4.UInt64(asset.total), + frame_dig -1 + asset_params_get AssetTotal + assert // asset exists + itob + frame_bury 6 + // smart_contracts/asset_labeling/contract.py:394 + // decimals=arc4.UInt8(asset.decimals), + frame_dig -1 + asset_params_get AssetDecimals + assert // asset exists + itob + dup + bitlen + intc_3 // 8 + <= + assert // overflow + extract 7 1 + frame_bury 5 + // smart_contracts/asset_labeling/contract.py:395 + // manager=arc4.Address(asset.manager), + frame_dig -1 + asset_params_get AssetManager + swap + frame_bury 9 + assert // asset exists + // smart_contracts/asset_labeling/contract.py:396 + // freeze=arc4.Address(asset.freeze), + frame_dig -1 + asset_params_get AssetFreeze + swap + frame_bury 10 + assert // asset exists + // smart_contracts/asset_labeling/contract.py:397 + // clawback=arc4.Address(asset.clawback), + frame_dig -1 + asset_params_get AssetClawback + swap + frame_bury 11 + assert // asset exists + // smart_contracts/asset_labeling/contract.py:398 + // reserve=arc4.Address(asset.reserve), + frame_dig -1 + asset_params_get AssetReserve + swap + frame_bury 8 + assert // asset exists + // smart_contracts/asset_labeling/contract.py:400 + // metadata_hash=arc4.DynamicBytes(asset.metadata_hash), + frame_dig -1 + asset_params_get AssetMetadataHash + assert // asset exists + dup + len + itob + extract 6 2 + swap + concat + frame_bury 0 + // smart_contracts/asset_labeling/contract.py:399 + // reserve_balance=arc4.UInt64(reserve_balance), + itob + frame_bury 7 + // smart_contracts/asset_labeling/contract.py:401 + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + frame_dig -1 + itob + dup + frame_bury 4 + box_len + bury 1 + bz _get_asset_full_ternary_false@5 + frame_dig 4 + box_get + assert // check self.assets entry exists + +_get_asset_full_ternary_merge@6: + // smart_contracts/asset_labeling/contract.py:389-402 + // return AssetFull( + // name=b2str(asset.name), + // unit_name=b2str(asset.unit_name), + // url=b2str(asset.url), + // total=arc4.UInt64(asset.total), + // decimals=arc4.UInt8(asset.decimals), + // manager=arc4.Address(asset.manager), + // freeze=arc4.Address(asset.freeze), + // clawback=arc4.Address(asset.clawback), + // reserve=arc4.Address(asset.reserve), + // reserve_balance=arc4.UInt64(reserve_balance), + // metadata_hash=arc4.DynamicBytes(asset.metadata_hash), + // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + // ) + frame_dig 1 + dup + len + pushint 155 // 155 + + + dup + itob + extract 6 2 + pushbytes 0x009b + swap + concat + frame_dig 2 + dup + cover 3 + len + uncover 2 + + + dup + itob + extract 6 2 + uncover 2 + swap + concat + frame_dig 3 + dup + cover 3 + len + uncover 2 + + + swap + frame_dig 6 + concat + frame_dig 5 + concat + frame_dig 9 + concat + frame_dig 10 + concat + frame_dig 11 + concat + frame_dig 8 + concat + dig 1 + itob + extract 6 2 + concat + frame_dig 0 + dup + cover 3 + len + uncover 2 + + + swap + frame_dig 7 + concat + swap + itob + extract 6 2 + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + swap + concat + frame_bury 0 + retsub + +_get_asset_full_ternary_false@5: + // smart_contracts/asset_labeling/contract.py:43 + // return arc4.DynamicArray[arc4.String]() + bytec_2 // 0x0000 + b _get_asset_full_ternary_merge@6 + +_get_asset_full_ternary_false@2: + // smart_contracts/asset_labeling/contract.py:387 + // else UInt64(0) + intc_1 // 0 + b _get_asset_full_ternary_merge@3 + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_full(asset: uint64) -> bytes: +get_asset_full: + // smart_contracts/asset_labeling/contract.py:404-405 + // @abimethod(readonly=True) + // def get_asset_full(self, asset: UInt64) -> AssetFull: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:406 + // return self._get_asset_full(asset) + frame_dig -1 + callsub _get_asset_full + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_full(assets: bytes) -> void: +get_assets_full: + // smart_contracts/asset_labeling/contract.py:408-409 + // @abimethod(readonly=True) + // def get_assets_full(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:410 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_full_for_header@1: + // smart_contracts/asset_labeling/contract.py:410 + // for _i, asset_id in uenumerate(assets): + frame_dig 1 + frame_dig 0 + < + bz get_assets_full_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_3 // 8 + * + // smart_contracts/asset_labeling/contract.py:411 + // log(self._get_asset_full(asset_id.native)) + extract_uint64 + callsub _get_asset_full + log + intc_0 // 1 + + + frame_bury 1 + b get_assets_full_for_header@1 + +get_assets_full_after_for@4: + retsub diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json new file mode 100644 index 0000000..8e8f72a --- /dev/null +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json @@ -0,0 +1,873 @@ +{ + "name": "AssetLabeling", + "structs": { + "AssetFull": [ + { + "name": "name", + "type": "string" + }, + { + "name": "unit_name", + "type": "string" + }, + { + "name": "url", + "type": "string" + }, + { + "name": "total", + "type": "uint64" + }, + { + "name": "decimals", + "type": "uint8" + }, + { + "name": "manager", + "type": "address" + }, + { + "name": "freeze", + "type": "address" + }, + { + "name": "clawback", + "type": "address" + }, + { + "name": "reserve", + "type": "address" + }, + { + "name": "metadata_hash", + "type": "byte[]" + }, + { + "name": "reserve_balance", + "type": "uint64" + }, + { + "name": "labels", + "type": "string[]" + } + ], + "AssetMicro": [ + { + "name": "unit_name", + "type": "string" + }, + { + "name": "decimals", + "type": "uint8" + } + ], + "AssetMicroLabels": [ + { + "name": "unit_name", + "type": "string" + }, + { + "name": "decimals", + "type": "uint8" + }, + { + "name": "labels", + "type": "string[]" + } + ], + "AssetSmall": [ + { + "name": "name", + "type": "string" + }, + { + "name": "unit_name", + "type": "string" + }, + { + "name": "decimals", + "type": "uint8" + }, + { + "name": "total", + "type": "uint64" + }, + { + "name": "has_freeze", + "type": "bool" + }, + { + "name": "has_clawback", + "type": "bool" + }, + { + "name": "labels", + "type": "string[]" + } + ], + "AssetText": [ + { + "name": "name", + "type": "string" + }, + { + "name": "unit_name", + "type": "string" + }, + { + "name": "url", + "type": "string" + }, + { + "name": "labels", + "type": "string[]" + } + ], + "LabelDescriptor": [ + { + "name": "name", + "type": "string" + }, + { + "name": "num_assets", + "type": "uint64" + }, + { + "name": "num_operators", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "change_admin", + "args": [ + { + "type": "account", + "name": "new_admin" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "add_label", + "args": [ + { + "type": "string", + "name": "id" + }, + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "remove_label", + "args": [ + { + "type": "string", + "name": "id" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_label", + "args": [ + { + "type": "string", + "name": "id" + } + ], + "returns": { + "type": "(string,uint64,uint64)", + "struct": "LabelDescriptor" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "log_labels", + "args": [ + { + "type": "string[]", + "name": "ids" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "add_operator_to_label", + "args": [ + { + "type": "account", + "name": "operator" + }, + { + "type": "string", + "name": "label" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "remove_operator_from_label", + "args": [ + { + "type": "account", + "name": "operator" + }, + { + "type": "string", + "name": "label" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_operator_labels", + "args": [ + { + "type": "account", + "name": "operator" + } + ], + "returns": { + "type": "string[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "add_label_to_asset", + "args": [ + { + "type": "string", + "name": "label" + }, + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "remove_label_from_asset", + "args": [ + { + "type": "string", + "name": "label" + }, + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_labels", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "string[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_labels", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "string[][]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_micro", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "returns": { + "type": "(string,uint8)", + "struct": "AssetMicro" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_micro", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_micro_labels", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "returns": { + "type": "(string,uint8,string[])", + "struct": "AssetMicroLabels" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_micro_labels", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_text", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "returns": { + "type": "(string,string,string,string[])", + "struct": "AssetText" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_text", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_small", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "returns": { + "type": "(string,string,uint8,uint64,bool,bool,string[])", + "struct": "AssetSmall" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_small", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_full", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "returns": { + "type": "(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])", + "struct": "AssetFull" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_full", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "admin": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "YWRtaW4=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "labels": { + "keyType": "AVMString", + "valueType": "LabelDescriptor", + "prefix": "" + }, + "assets": { + "keyType": "AVMUint64", + "valueType": "string[]", + "prefix": "" + }, + "operators": { + "keyType": "AVMBytes", + "valueType": "string[]", + "prefix": "" + } + } + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 1107, + 1546, + 1565, + 1990 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 287, + 302, + 322, + 337, + 357, + 372, + 392, + 407, + 427, + 442, + 462, + 481, + 503, + 527, + 551, + 573, + 597, + 621, + 636, + 658, + 676, + 700 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 2856 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 2274, + 2282, + 2358, + 2366, + 2478, + 2486, + 2494, + 2635, + 2643, + 2651, + 2665, + 2671, + 2686, + 2840, + 2861, + 2871, + 2881, + 2891, + 2899, + 2918, + 2926, + 2934, + 2942, + 2947 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 723 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 290, + 305, + 325, + 340, + 360, + 375, + 395, + 410, + 430, + 445, + 465, + 484, + 506, + 530, + 554, + 576, + 600, + 624, + 639, + 661, + 679, + 703 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 981, + 1204 + ], + "errorMessage": "check self.admin exists" + }, + { + "pc": [ + 1796, + 1846, + 1971, + 1982, + 2062, + 2160, + 2207, + 2389, + 2511, + 2710, + 2976 + ], + "errorMessage": "check self.assets entry exists" + }, + { + "pc": [ + 1106, + 1142, + 1185, + 1421, + 1545, + 1819, + 2026 + ], + "errorMessage": "check self.labels entry exists" + }, + { + "pc": [ + 1286, + 1395, + 1604, + 1629, + 1733 + ], + "errorMessage": "check self.operators entry exists" + }, + { + "pc": [ + 2288, + 2372, + 2657, + 2905 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4ZTFiYjk1ZmMgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQyCiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF90ZXh0KGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUtMzQ2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X3RleHQoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRUZXh0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ3CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3RleHQoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c190ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHQoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3RleHRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTYtMzU3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjUKICAgIC8vIGhhc19jbGF3YmFjaz1hcmM0LkJvb2woYXNzZXQuY2xhd2JhY2sgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1OS0zNjcKICAgIC8vIHJldHVybiBBc3NldFNtYWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGhhc19mcmVlemU9YXJjNC5Cb29sKGFzc2V0LmZyZWV6ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDEwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgcHVzaGludCAxMDUgLy8gMTA1CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9zbWFsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFNtYWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcxCiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfc21hbGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfc21hbGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMtMzc0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19zbWFsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc2CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19zbWFsbF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAtMzgxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgzCiAgICAvLyByZXNlcnZlX2FjY3QgPSBBY2NvdW50KGFzc2V0LnJlc2VydmUuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NS0zODcKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgLy8gZWxzZSBVSW50NjQoMCkKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MgogICAgLy8gdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MwogICAgLy8gdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBtYW5hZ2VyPWFyYzQuQWRkcmVzcyhhc3NldC5tYW5hZ2VyKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEwCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk3CiAgICAvLyBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTgKICAgIC8vIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA4CiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAwCiAgICAvLyBtZXRhZGF0YV9oYXNoPWFyYzQuRHluYW1pY0J5dGVzKGFzc2V0Lm1ldGFkYXRhX2hhc2gpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk5CiAgICAvLyByZXNlcnZlX2JhbGFuY2U9YXJjNC5VSW50NjQocmVzZXJ2ZV9iYWxhbmNlKSwKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDUKICAgIGZyYW1lX2RpZyA0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4OS00MDIKICAgIC8vIHJldHVybiBBc3NldEZ1bGwoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICAvLyAgICAgZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgLy8gICAgIGNsYXdiYWNrPWFyYzQuQWRkcmVzcyhhc3NldC5jbGF3YmFjayksCiAgICAvLyAgICAgcmVzZXJ2ZT1hcmM0LkFkZHJlc3MoYXNzZXQucmVzZXJ2ZSksCiAgICAvLyAgICAgcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICAvLyAgICAgbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNTUgLy8gMTU1CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDliCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA5CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDgKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANgoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODcKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNC00MDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfZnVsbChhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfZnVsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfZnVsbF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2Z1bGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0E4buV/ARVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/9xBUSI+f+L/xZJvUUBQQBCiwO+RIsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQiwJJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/vooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 6, + "patch": 1 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map new file mode 100644 index 0000000..7e7f2c0 --- /dev/null +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.puya.map @@ -0,0 +1,25 @@ +{ + "version": 3, + "sources": [], + "mappings": ";;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", + "params": {}, + "block": "main", + "stack_in": [], + "op": "pushint 1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "3": { + "op": "return", + "stack_out": [] + } + } +} \ No newline at end of file diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal new file mode 100644 index 0000000..a433105 --- /dev/null +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: +main: + pushint 1 // 1 + return diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts new file mode 100644 index 0000000..f92d2c4 --- /dev/null +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts @@ -0,0 +1,2560 @@ +/* eslint-disable */ +/** + * This file was automatically generated by @algorandfoundation/algokit-client-generator. + * DO NOT MODIFY IT BY HAND. + * requires: @algorandfoundation/algokit-utils: ^7 + */ +import { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client' +import { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app' +import { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56' +import { + AppClient as _AppClient, + AppClientMethodCallParams, + AppClientParams, + AppClientBareCallParams, + CallOnComplete, + AppClientCompilationParams, + ResolveAppClientByCreatorAndName, + ResolveAppClientByNetwork, + CloneAppClientParams, +} from '@algorandfoundation/algokit-utils/types/app-client' +import { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer' +import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction' +import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' +import SimulateResponse = modelsv2.SimulateResponse + +export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"labels","type":"string[]"}],"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro_labels","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_text","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,string[])","struct":"AssetText"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_text","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_small","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_small","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_full","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_full","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1107,1546,1565,1990],"errorMessage":"Index access is out of bounds"},{"pc":[287,302,322,337,357,372,392,407,427,442,462,481,503,527,551,573,597,621,636,658,676,700],"errorMessage":"OnCompletion is not NoOp"},{"pc":[2856],"errorMessage":"account opted into asset"},{"pc":[2274,2282,2358,2366,2478,2486,2494,2635,2643,2651,2665,2671,2686,2840,2861,2871,2881,2891,2899,2918,2926,2934,2942,2947],"errorMessage":"asset exists"},{"pc":[723],"errorMessage":"can only call when creating"},{"pc":[290,305,325,340,360,375,395,410,430,445,465,484,506,530,554,576,600,624,639,661,679,703],"errorMessage":"can only call when not creating"},{"pc":[981,1204],"errorMessage":"check self.admin exists"},{"pc":[1796,1846,1971,1982,2062,2160,2207,2389,2511,2710,2976],"errorMessage":"check self.assets entry exists"},{"pc":[1106,1142,1185,1421,1545,1819,2026],"errorMessage":"check self.labels entry exists"},{"pc":[1286,1395,1604,1629,1733],"errorMessage":"check self.operators entry exists"},{"pc":[2288,2372,2657,2905],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4ZTFiYjk1ZmMgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQyCiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF90ZXh0KGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUtMzQ2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X3RleHQoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRUZXh0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ3CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3RleHQoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c190ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHQoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3RleHRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTYtMzU3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjUKICAgIC8vIGhhc19jbGF3YmFjaz1hcmM0LkJvb2woYXNzZXQuY2xhd2JhY2sgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1OS0zNjcKICAgIC8vIHJldHVybiBBc3NldFNtYWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGhhc19mcmVlemU9YXJjNC5Cb29sKGFzc2V0LmZyZWV6ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDEwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgcHVzaGludCAxMDUgLy8gMTA1CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9zbWFsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFNtYWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcxCiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfc21hbGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfc21hbGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMtMzc0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19zbWFsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc2CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19zbWFsbF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAtMzgxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgzCiAgICAvLyByZXNlcnZlX2FjY3QgPSBBY2NvdW50KGFzc2V0LnJlc2VydmUuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NS0zODcKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgLy8gZWxzZSBVSW50NjQoMCkKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MgogICAgLy8gdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MwogICAgLy8gdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBtYW5hZ2VyPWFyYzQuQWRkcmVzcyhhc3NldC5tYW5hZ2VyKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEwCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk3CiAgICAvLyBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTgKICAgIC8vIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA4CiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAwCiAgICAvLyBtZXRhZGF0YV9oYXNoPWFyYzQuRHluYW1pY0J5dGVzKGFzc2V0Lm1ldGFkYXRhX2hhc2gpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk5CiAgICAvLyByZXNlcnZlX2JhbGFuY2U9YXJjNC5VSW50NjQocmVzZXJ2ZV9iYWxhbmNlKSwKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDUKICAgIGZyYW1lX2RpZyA0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4OS00MDIKICAgIC8vIHJldHVybiBBc3NldEZ1bGwoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICAvLyAgICAgZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgLy8gICAgIGNsYXdiYWNrPWFyYzQuQWRkcmVzcyhhc3NldC5jbGF3YmFjayksCiAgICAvLyAgICAgcmVzZXJ2ZT1hcmM0LkFkZHJlc3MoYXNzZXQucmVzZXJ2ZSksCiAgICAvLyAgICAgcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICAvLyAgICAgbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNTUgLy8gMTU1CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDliCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA5CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDgKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANgoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODcKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNC00MDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfZnVsbChhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfZnVsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfZnVsbF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2Z1bGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0E4buV/ARVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/9xBUSI+f+L/xZJvUUBQQBCiwO+RIsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQiwJJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/vooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract + +/** + * A state record containing binary data + */ +export interface BinaryState { + /** + * Gets the state value as a Uint8Array + */ + asByteArray(): Uint8Array | undefined + /** + * Gets the state value as a string + */ + asString(): string | undefined +} + +class BinaryStateValue implements BinaryState { + constructor(private value: Uint8Array | undefined) {} + + asByteArray(): Uint8Array | undefined { + return this.value + } + + asString(): string | undefined { + return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined + } +} + +/** + * Expands types for IntelliSense so they are more human readable + * See https://stackoverflow.com/a/69288824 + */ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never + + +// Type definitions for ARC-56 structs + +export type AssetFull = { + name: string, + unitName: string, + url: string, + total: bigint, + decimals: number, + manager: string, + freeze: string, + clawback: string, + reserve: string, + metadataHash: Uint8Array, + reserveBalance: bigint, + labels: string[] +} + + +/** + * Converts the ABI tuple representation of a AssetFull to the struct representation + */ +export function AssetFullFromTuple(abiTuple: [string, string, string, bigint, number, string, string, string, string, Uint8Array, bigint, string[]]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetFull, APP_SPEC.structs) as AssetFull +} + +export type AssetMicro = { + unitName: string, + decimals: number +} + + +/** + * Converts the ABI tuple representation of a AssetMicro to the struct representation + */ +export function AssetMicroFromTuple(abiTuple: [string, number]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicro, APP_SPEC.structs) as AssetMicro +} + +export type AssetMicroLabels = { + unitName: string, + decimals: number, + labels: string[] +} + + +/** + * Converts the ABI tuple representation of a AssetMicroLabels to the struct representation + */ +export function AssetMicroLabelsFromTuple(abiTuple: [string, number, string[]]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicroLabels, APP_SPEC.structs) as AssetMicroLabels +} + +export type AssetSmall = { + name: string, + unitName: string, + decimals: number, + total: bigint, + hasFreeze: boolean, + hasClawback: boolean, + labels: string[] +} + + +/** + * Converts the ABI tuple representation of a AssetSmall to the struct representation + */ +export function AssetSmallFromTuple(abiTuple: [string, string, number, bigint, boolean, boolean, string[]]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetSmall, APP_SPEC.structs) as AssetSmall +} + +export type AssetText = { + name: string, + unitName: string, + url: string, + labels: string[] +} + + +/** + * Converts the ABI tuple representation of a AssetText to the struct representation + */ +export function AssetTextFromTuple(abiTuple: [string, string, string, string[]]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetText, APP_SPEC.structs) as AssetText +} + +export type LabelDescriptor = { + name: string, + numAssets: bigint, + numOperators: bigint +} + + +/** + * Converts the ABI tuple representation of a LabelDescriptor to the struct representation + */ +export function LabelDescriptorFromTuple(abiTuple: [string, bigint, bigint]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.LabelDescriptor, APP_SPEC.structs) as LabelDescriptor +} + +/** + * The argument types for the AssetLabeling contract + */ +export type AssetLabelingArgs = { + /** + * The object representation of the arguments for each method + */ + obj: { + 'change_admin(account)void': { + newAdmin: Uint8Array | string + } + 'add_label(string,string)void': { + id: string + name: string + } + 'remove_label(string)void': { + id: string + } + 'get_label(string)(string,uint64,uint64)': { + id: string + } + 'log_labels(string[])void': { + ids: string[] + } + 'add_operator_to_label(account,string)void': { + operator: Uint8Array | string + label: string + } + 'remove_operator_from_label(account,string)void': { + operator: Uint8Array | string + label: string + } + 'get_operator_labels(account)string[]': { + operator: Uint8Array | string + } + 'add_label_to_asset(string,asset)void': { + label: string + asset: bigint + } + 'remove_label_from_asset(string,asset)void': { + label: string + asset: bigint + } + 'get_asset_labels(asset)string[]': { + asset: bigint + } + 'get_assets_labels(uint64[])string[][]': { + assets: bigint[] | number[] + } + 'get_asset_micro(uint64)(string,uint8)': { + asset: bigint | number + } + 'get_assets_micro(uint64[])void': { + assets: bigint[] | number[] + } + 'get_asset_micro_labels(uint64)(string,uint8,string[])': { + asset: bigint | number + } + 'get_assets_micro_labels(uint64[])void': { + assets: bigint[] | number[] + } + 'get_asset_text(uint64)(string,string,string,string[])': { + asset: bigint | number + } + 'get_assets_text(uint64[])void': { + assets: bigint[] | number[] + } + 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': { + asset: bigint | number + } + 'get_assets_small(uint64[])void': { + assets: bigint[] | number[] + } + 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': { + asset: bigint | number + } + 'get_assets_full(uint64[])void': { + assets: bigint[] | number[] + } + } + /** + * The tuple representation of the arguments for each method + */ + tuple: { + 'change_admin(account)void': [newAdmin: Uint8Array | string] + 'add_label(string,string)void': [id: string, name: string] + 'remove_label(string)void': [id: string] + 'get_label(string)(string,uint64,uint64)': [id: string] + 'log_labels(string[])void': [ids: string[]] + 'add_operator_to_label(account,string)void': [operator: Uint8Array | string, label: string] + 'remove_operator_from_label(account,string)void': [operator: Uint8Array | string, label: string] + 'get_operator_labels(account)string[]': [operator: Uint8Array | string] + 'add_label_to_asset(string,asset)void': [label: string, asset: bigint] + 'remove_label_from_asset(string,asset)void': [label: string, asset: bigint] + 'get_asset_labels(asset)string[]': [asset: bigint] + 'get_assets_labels(uint64[])string[][]': [assets: bigint[] | number[]] + 'get_asset_micro(uint64)(string,uint8)': [asset: bigint | number] + 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_micro_labels(uint64)(string,uint8,string[])': [asset: bigint | number] + 'get_assets_micro_labels(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_text(uint64)(string,string,string,string[])': [asset: bigint | number] + 'get_assets_text(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': [asset: bigint | number] + 'get_assets_small(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': [asset: bigint | number] + 'get_assets_full(uint64[])void': [assets: bigint[] | number[]] + } +} + +/** + * The return type for each method + */ +export type AssetLabelingReturns = { + 'change_admin(account)void': void + 'add_label(string,string)void': void + 'remove_label(string)void': void + 'get_label(string)(string,uint64,uint64)': LabelDescriptor + 'log_labels(string[])void': void + 'add_operator_to_label(account,string)void': void + 'remove_operator_from_label(account,string)void': void + 'get_operator_labels(account)string[]': string[] + 'add_label_to_asset(string,asset)void': void + 'remove_label_from_asset(string,asset)void': void + 'get_asset_labels(asset)string[]': string[] + 'get_assets_labels(uint64[])string[][]': string[][] + 'get_asset_micro(uint64)(string,uint8)': AssetMicro + 'get_assets_micro(uint64[])void': void + 'get_asset_micro_labels(uint64)(string,uint8,string[])': AssetMicroLabels + 'get_assets_micro_labels(uint64[])void': void + 'get_asset_text(uint64)(string,string,string,string[])': AssetText + 'get_assets_text(uint64[])void': void + 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': AssetSmall + 'get_assets_small(uint64[])void': void + 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': AssetFull + 'get_assets_full(uint64[])void': void +} + +/** + * Defines the types of available calls and state of the AssetLabeling smart contract. + */ +export type AssetLabelingTypes = { + /** + * Maps method signatures / names to their argument and return types. + */ + methods: + & Record<'change_admin(account)void' | 'change_admin', { + argsObj: AssetLabelingArgs['obj']['change_admin(account)void'] + argsTuple: AssetLabelingArgs['tuple']['change_admin(account)void'] + returns: AssetLabelingReturns['change_admin(account)void'] + }> + & Record<'add_label(string,string)void' | 'add_label', { + argsObj: AssetLabelingArgs['obj']['add_label(string,string)void'] + argsTuple: AssetLabelingArgs['tuple']['add_label(string,string)void'] + returns: AssetLabelingReturns['add_label(string,string)void'] + }> + & Record<'remove_label(string)void' | 'remove_label', { + argsObj: AssetLabelingArgs['obj']['remove_label(string)void'] + argsTuple: AssetLabelingArgs['tuple']['remove_label(string)void'] + returns: AssetLabelingReturns['remove_label(string)void'] + }> + & Record<'get_label(string)(string,uint64,uint64)' | 'get_label', { + argsObj: AssetLabelingArgs['obj']['get_label(string)(string,uint64,uint64)'] + argsTuple: AssetLabelingArgs['tuple']['get_label(string)(string,uint64,uint64)'] + returns: AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] + }> + & Record<'log_labels(string[])void' | 'log_labels', { + argsObj: AssetLabelingArgs['obj']['log_labels(string[])void'] + argsTuple: AssetLabelingArgs['tuple']['log_labels(string[])void'] + returns: AssetLabelingReturns['log_labels(string[])void'] + }> + & Record<'add_operator_to_label(account,string)void' | 'add_operator_to_label', { + argsObj: AssetLabelingArgs['obj']['add_operator_to_label(account,string)void'] + argsTuple: AssetLabelingArgs['tuple']['add_operator_to_label(account,string)void'] + returns: AssetLabelingReturns['add_operator_to_label(account,string)void'] + }> + & Record<'remove_operator_from_label(account,string)void' | 'remove_operator_from_label', { + argsObj: AssetLabelingArgs['obj']['remove_operator_from_label(account,string)void'] + argsTuple: AssetLabelingArgs['tuple']['remove_operator_from_label(account,string)void'] + returns: AssetLabelingReturns['remove_operator_from_label(account,string)void'] + }> + & Record<'get_operator_labels(account)string[]' | 'get_operator_labels', { + argsObj: AssetLabelingArgs['obj']['get_operator_labels(account)string[]'] + argsTuple: AssetLabelingArgs['tuple']['get_operator_labels(account)string[]'] + returns: AssetLabelingReturns['get_operator_labels(account)string[]'] + }> + & Record<'add_label_to_asset(string,asset)void' | 'add_label_to_asset', { + argsObj: AssetLabelingArgs['obj']['add_label_to_asset(string,asset)void'] + argsTuple: AssetLabelingArgs['tuple']['add_label_to_asset(string,asset)void'] + returns: AssetLabelingReturns['add_label_to_asset(string,asset)void'] + }> + & Record<'remove_label_from_asset(string,asset)void' | 'remove_label_from_asset', { + argsObj: AssetLabelingArgs['obj']['remove_label_from_asset(string,asset)void'] + argsTuple: AssetLabelingArgs['tuple']['remove_label_from_asset(string,asset)void'] + returns: AssetLabelingReturns['remove_label_from_asset(string,asset)void'] + }> + & Record<'get_asset_labels(asset)string[]' | 'get_asset_labels', { + argsObj: AssetLabelingArgs['obj']['get_asset_labels(asset)string[]'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_labels(asset)string[]'] + returns: AssetLabelingReturns['get_asset_labels(asset)string[]'] + }> + & Record<'get_assets_labels(uint64[])string[][]' | 'get_assets_labels', { + argsObj: AssetLabelingArgs['obj']['get_assets_labels(uint64[])string[][]'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_labels(uint64[])string[][]'] + returns: AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] + }> + & Record<'get_asset_micro(uint64)(string,uint8)' | 'get_asset_micro', { + argsObj: AssetLabelingArgs['obj']['get_asset_micro(uint64)(string,uint8)'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_micro(uint64)(string,uint8)'] + returns: AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] + }> + & Record<'get_assets_micro(uint64[])void' | 'get_assets_micro', { + argsObj: AssetLabelingArgs['obj']['get_assets_micro(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_micro(uint64[])void'] + returns: AssetLabelingReturns['get_assets_micro(uint64[])void'] + }> + & Record<'get_asset_micro_labels(uint64)(string,uint8,string[])' | 'get_asset_micro_labels', { + argsObj: AssetLabelingArgs['obj']['get_asset_micro_labels(uint64)(string,uint8,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_micro_labels(uint64)(string,uint8,string[])'] + returns: AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'] + }> + & Record<'get_assets_micro_labels(uint64[])void' | 'get_assets_micro_labels', { + argsObj: AssetLabelingArgs['obj']['get_assets_micro_labels(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_micro_labels(uint64[])void'] + returns: AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] + }> + & Record<'get_asset_text(uint64)(string,string,string,string[])' | 'get_asset_text', { + argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string,string[])'] + returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] + }> + & Record<'get_assets_text(uint64[])void' | 'get_assets_text', { + argsObj: AssetLabelingArgs['obj']['get_assets_text(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_text(uint64[])void'] + returns: AssetLabelingReturns['get_assets_text(uint64[])void'] + }> + & Record<'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])' | 'get_asset_small', { + argsObj: AssetLabelingArgs['obj']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + returns: AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + }> + & Record<'get_assets_small(uint64[])void' | 'get_assets_small', { + argsObj: AssetLabelingArgs['obj']['get_assets_small(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_small(uint64[])void'] + returns: AssetLabelingReturns['get_assets_small(uint64[])void'] + }> + & Record<'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])' | 'get_asset_full', { + argsObj: AssetLabelingArgs['obj']['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + returns: AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + }> + & Record<'get_assets_full(uint64[])void' | 'get_assets_full', { + argsObj: AssetLabelingArgs['obj']['get_assets_full(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_full(uint64[])void'] + returns: AssetLabelingReturns['get_assets_full(uint64[])void'] + }> + /** + * Defines the shape of the state of the application. + */ + state: { + global: { + keys: { + admin: BinaryState + } + maps: {} + } + box: { + keys: {} + maps: { + labels: Map + assets: Map + operators: Map + } + } + } +} + +/** + * Defines the possible abi call signatures. + */ +export type AssetLabelingSignatures = keyof AssetLabelingTypes['methods'] +/** + * Defines the possible abi call signatures for methods that return a non-void value. + */ +export type AssetLabelingNonVoidMethodSignatures = keyof AssetLabelingTypes['methods'] extends infer T ? T extends keyof AssetLabelingTypes['methods'] ? MethodReturn extends void ? never : T : never : never +/** + * Defines an object containing all relevant parameters for a single call to the contract. + */ +export type CallParams = Expand< + Omit & + { + /** The args for the ABI method call, either as an ordered array or an object */ + args: Expand + } +> +/** + * Maps a method signature from the AssetLabeling smart contract to the method's arguments in either tuple or struct form + */ +export type MethodArgs = AssetLabelingTypes['methods'][TSignature]['argsObj' | 'argsTuple'] +/** + * Maps a method signature from the AssetLabeling smart contract to the method's return type + */ +export type MethodReturn = AssetLabelingTypes['methods'][TSignature]['returns'] + +/** + * Defines the shape of the keyed global state of the application. + */ +export type GlobalKeysState = AssetLabelingTypes['state']['global']['keys'] + +/** + * Defines the shape of the keyed box state of the application. + */ +export type BoxKeysState = AssetLabelingTypes['state']['box']['keys'] + + +/** + * Defines supported create method params for this smart contract + */ +export type AssetLabelingCreateCallParams = + | Expand +/** + * Defines arguments required for the deploy method. + */ +export type AssetLabelingDeployParams = Expand & { + /** + * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available) + */ + createParams?: AssetLabelingCreateCallParams +}> + + +/** + * Exposes methods for constructing `AppClient` params objects for ABI calls to the AssetLabeling smart contract + */ +export abstract class AssetLabelingParamsFactory { + /** + * Constructs a no op call for the change_admin(account)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static changeAdmin(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'change_admin(account)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.newAdmin], + } + } + /** + * Constructs a no op call for the add_label(string,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'add_label(string,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.name], + } + } + /** + * Constructs a no op call for the remove_label(string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static removeLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'remove_label(string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.id], + } + } + /** + * Constructs a no op call for the get_label(string)(string,uint64,uint64) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_label(string)(string,uint64,uint64)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.id], + } + } + /** + * Constructs a no op call for the log_labels(string[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static logLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'log_labels(string[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.ids], + } + } + /** + * Constructs a no op call for the add_operator_to_label(account,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addOperatorToLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'add_operator_to_label(account,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.operator, params.args.label], + } + } + /** + * Constructs a no op call for the remove_operator_from_label(account,string)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static removeOperatorFromLabel(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'remove_operator_from_label(account,string)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.operator, params.args.label], + } + } + /** + * Constructs a no op call for the get_operator_labels(account)string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getOperatorLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_operator_labels(account)string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.operator], + } + } + /** + * Constructs a no op call for the add_label_to_asset(string,asset)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static addLabelToAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'add_label_to_asset(string,asset)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.label, params.args.asset], + } + } + /** + * Constructs a no op call for the remove_label_from_asset(string,asset)void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static removeLabelFromAsset(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'remove_label_from_asset(string,asset)void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.label, params.args.asset], + } + } + /** + * Constructs a no op call for the get_asset_labels(asset)string[] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_labels(asset)string[]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_labels(uint64[])string[][] ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_labels(uint64[])string[][]' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } + /** + * Constructs a no op call for the get_asset_micro(uint64)(string,uint8) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_micro(uint64)(string,uint8)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_micro(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsMicro(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_micro(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } + /** + * Constructs a no op call for the get_asset_micro_labels(uint64)(string,uint8,string[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetMicroLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_micro_labels(uint64)(string,uint8,string[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_micro_labels(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsMicroLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_micro_labels(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } + /** + * Constructs a no op call for the get_asset_text(uint64)(string,string,string,string[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_text(uint64)(string,string,string,string[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_text(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_text(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } + /** + * Constructs a no op call for the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetSmall(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_small(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsSmall(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_small(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } + /** + * Constructs a no op call for the get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetFull(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_full(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsFull(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_full(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } +} + +/** + * A factory to create and deploy one or more instance of the AssetLabeling smart contract and to create one or more app clients to interact with those (or other) app instances + */ +export class AssetLabelingFactory { + /** + * The underlying `AppFactory` for when you want to have more flexibility + */ + public readonly appFactory: _AppFactory + + /** + * Creates a new instance of `AssetLabelingFactory` + * + * @param params The parameters to initialise the app factory with + */ + constructor(params: Omit) { + this.appFactory = new _AppFactory({ + ...params, + appSpec: APP_SPEC, + }) + } + + /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */ + public get appName() { + return this.appFactory.appName + } + + /** The ARC-56 app spec being used */ + get appSpec() { + return APP_SPEC + } + + /** A reference to the underlying `AlgorandClient` this app factory is using. */ + public get algorand(): AlgorandClient { + return this.appFactory.algorand + } + + /** + * Returns a new `AppClient` client for an app instance of the given ID. + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public getAppClientById(params: AppFactoryAppClientParams) { + return new AssetLabelingClient(this.appFactory.getAppClientById(params)) + } + + /** + * Returns a new `AppClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * + * Automatically populates appName, defaultSender and source maps from the factory + * if not specified in the params. + * @param params The parameters to create the app client + * @returns The `AppClient` + */ + public async getAppClientByCreatorAndName( + params: AppFactoryResolveAppClientByCreatorAndNameParams, + ) { + return new AssetLabelingClient(await this.appFactory.getAppClientByCreatorAndName(params)) + } + + /** + * Idempotently deploys the AssetLabeling smart contract. + * + * @param params The arguments for the contract calls and any additional parameters for the call + * @returns The deployment result + */ + public async deploy(params: AssetLabelingDeployParams = {}) { + const result = await this.appFactory.deploy({ + ...params, + }) + return { result: result.result, appClient: new AssetLabelingClient(result.appClient) } + } + + /** + * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.create(params) + }, + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The transaction for a create call + */ + bare: (params?: Expand) => { + return this.appFactory.createTransaction.bare.create(params) + }, + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Gets available create methods + */ + create: { + /** + * Creates a new instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The create result + */ + bare: async (params?: Expand) => { + const result = await this.appFactory.send.bare.create(params) + return { result: result.result, appClient: new AssetLabelingClient(result.appClient) } + }, + }, + + } + +} +/** + * A client to make calls to the AssetLabeling smart contract + */ +export class AssetLabelingClient { + /** + * The underlying `AppClient` for when you want to have more flexibility + */ + public readonly appClient: _AppClient + + /** + * Creates a new instance of `AssetLabelingClient` + * + * @param appClient An `AppClient` instance which has been created with the AssetLabeling app spec + */ + constructor(appClient: _AppClient) + /** + * Creates a new instance of `AssetLabelingClient` + * + * @param params The parameters to initialise the app client with + */ + constructor(params: Omit) + constructor(appClientOrParams: _AppClient | Omit) { + this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({ + ...appClientOrParams, + appSpec: APP_SPEC, + }) + } + + /** + * Checks for decode errors on the given return value and maps the return value to the return type for the given method + * @returns The typed return value or undefined if there was no value + */ + decodeReturnValue(method: TSignature, returnValue: ABIReturn | undefined) { + return returnValue !== undefined ? getArc56ReturnValue>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined + } + + /** + * Returns a new `AssetLabelingClient` client, resolving the app by creator address and name + * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + * @param params The parameters to create the app client + */ + public static async fromCreatorAndName(params: Omit): Promise { + return new AssetLabelingClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC})) + } + + /** + * Returns an `AssetLabelingClient` instance for the current network based on + * pre-determined network-specific app IDs specified in the ARC-56 app spec. + * + * If no IDs are in the app spec or the network isn't recognised, an error is thrown. + * @param params The parameters to create the app client + */ + static async fromNetwork( + params: Omit + ): Promise { + return new AssetLabelingClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC})) + } + + /** The ID of the app instance this client is linked to. */ + public get appId() { + return this.appClient.appId + } + + /** The app address of the app instance this client is linked to. */ + public get appAddress() { + return this.appClient.appAddress + } + + /** The name of the app. */ + public get appName() { + return this.appClient.appName + } + + /** The ARC-56 app spec being used */ + public get appSpec() { + return this.appClient.appSpec + } + + /** A reference to the underlying `AlgorandClient` this app client is using. */ + public get algorand(): AlgorandClient { + return this.appClient.algorand + } + + /** + * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. + */ + readonly params = { + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.params.bare.clearState(params) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + changeAdmin: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.changeAdmin(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + addLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.addLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + removeLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.removeLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.logLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + addOperatorToLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + removeOperatorFromLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getOperatorLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + addLabelToAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.addLabelToAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call params + */ + removeLabelFromAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetFull(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsFull(params)) + }, + + } + + /** + * Create transactions for the current app + */ + readonly createTransaction = { + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.createTransaction.bare.clearState(params) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + changeAdmin: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.changeAdmin(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + addLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + removeLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + logLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.logLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + addOperatorToLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + removeOperatorFromLabel: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getOperatorLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + addLabelToAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.addLabelToAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + removeLabelFromAsset: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsMicro: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsMicroLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetFull(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsFull(params)) + }, + + } + + /** + * Send calls to the current app + */ + readonly send = { + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param params The params for the bare (raw) call + * @returns The clearState result + */ + clearState: (params?: Expand) => { + return this.appClient.send.bare.clearState(params) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `change_admin(account)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + changeAdmin: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.changeAdmin(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['change_admin(account)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label(string,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + addLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.addLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_label(string,string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label(string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + removeLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_label(string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_label(string)(string,uint64,uint64)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + logLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['log_labels(string[])void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_operator_to_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + addOperatorToLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.addOperatorToLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_operator_to_label(account,string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_operator_from_label(account,string)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + removeOperatorFromLabel: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeOperatorFromLabel(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_operator_from_label(account,string)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getOperatorLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_operator_labels(account)string[]'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `add_label_to_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + addLabelToAsset: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.addLabelToAsset(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['add_label_to_asset(string,asset)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `remove_label_from_asset(string,asset)void` ABI method. + * + * @param params The params for the smart contract call + * @returns The call result + */ + removeLabelFromAsset: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.removeLabelFromAsset(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['remove_label_from_asset(string,asset)void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_labels(asset)string[]'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_labels(uint64[])string[][]'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsMicro: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro(uint64[])void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetMicroLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsMicroLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro_labels(uint64[])void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsText(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_text(uint64[])void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetSmall: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetSmall(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsSmall: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_small(uint64[])void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetFull: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetFull(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsFull: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsFull(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_full(uint64[])void'])} + }, + + } + + /** + * Clone this app client with different params + * + * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value. + * @returns A new app client with the altered params + */ + public clone(params: CloneAppClientParams) { + return new AssetLabelingClient(this.appClient.clone(params)) + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_label(string)(string,uint64,uint64)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getLabel(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getLabel(params)) + return result.return as unknown as AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `log_labels(string[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async logLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.logLabels(params)) + return result.return as unknown as AssetLabelingReturns['log_labels(string[])void'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_operator_labels(account)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getOperatorLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getOperatorLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_operator_labels(account)string[]'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_labels(asset)string[]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_labels(asset)string[]'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_labels(uint64[])string[][]` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_micro(uint64)(string,uint8)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetMicro(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicro(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_micro(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsMicro(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicro(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_micro(uint64[])void'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_micro_labels(uint64)(string,uint8,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetMicroLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetMicroLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_micro_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsMicroLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetText(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsText(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsText(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_text(uint64[])void'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetSmall(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetSmall(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsSmall(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_small(uint64[])void'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetFull(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetFull(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsFull(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsFull(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_full(uint64[])void'] + } + + /** + * Methods to access state for the current AssetLabeling app + */ + state = { + /** + * Methods to access global state for the current AssetLabeling app + */ + global: { + /** + * Get all current keyed values from global state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.global.getAll() + return { + admin: new BinaryStateValue(result.admin), + } + }, + /** + * Get the current value of the admin key in global state + */ + admin: async (): Promise => { return new BinaryStateValue((await this.appClient.state.global.getValue("admin")) as Uint8Array | undefined) }, + }, + /** + * Methods to access box state for the current AssetLabeling app + */ + box: { + /** + * Get all current keyed values from box state + */ + getAll: async (): Promise>> => { + const result = await this.appClient.state.box.getAll() + return { + } + }, + /** + * Get values from the labels map in box state + */ + labels: { + /** + * Get all current values of the labels map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("labels")) as Map }, + /** + * Get a current value of the labels map by key from box state + */ + value: async (key: string): Promise => { return await this.appClient.state.box.getMapValue("labels", key) as LabelDescriptor | undefined }, + }, + /** + * Get values from the assets map in box state + */ + assets: { + /** + * Get all current values of the assets map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("assets")) as Map }, + /** + * Get a current value of the assets map by key from box state + */ + value: async (key: bigint): Promise => { return await this.appClient.state.box.getMapValue("assets", key) as string[] | undefined }, + }, + /** + * Get values from the operators map in box state + */ + operators: { + /** + * Get all current values of the operators map in box state + */ + getMap: async (): Promise> => { return (await this.appClient.state.box.getMap("operators")) as Map }, + /** + * Get a current value of the operators map by key from box state + */ + value: async (key: Uint8Array | string): Promise => { return await this.appClient.state.box.getMapValue("operators", key) as string[] | undefined }, + }, + }, + } + + public newGroup(): AssetLabelingComposer { + const client = this + const composer = this.algorand.newGroup() + let promiseChain:Promise = Promise.resolve() + const resultMappers: Array any)> = [] + return { + /** + * Add a change_admin(account)void method call against the AssetLabeling contract + */ + changeAdmin(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.changeAdmin(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a add_label(string,string)void method call against the AssetLabeling contract + */ + addLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a remove_label(string)void method call against the AssetLabeling contract + */ + removeLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_label(string)(string,uint64,uint64) method call against the AssetLabeling contract + */ + getLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getLabel(params))) + resultMappers.push((v) => client.decodeReturnValue('get_label(string)(string,uint64,uint64)', v)) + return this + }, + /** + * Add a log_labels(string[])void method call against the AssetLabeling contract + */ + logLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.logLabels(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a add_operator_to_label(account,string)void method call against the AssetLabeling contract + */ + addOperatorToLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addOperatorToLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a remove_operator_from_label(account,string)void method call against the AssetLabeling contract + */ + removeOperatorFromLabel(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeOperatorFromLabel(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_operator_labels(account)string[] method call against the AssetLabeling contract + */ + getOperatorLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getOperatorLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_operator_labels(account)string[]', v)) + return this + }, + /** + * Add a add_label_to_asset(string,asset)void method call against the AssetLabeling contract + */ + addLabelToAsset(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addLabelToAsset(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a remove_label_from_asset(string,asset)void method call against the AssetLabeling contract + */ + removeLabelFromAsset(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.removeLabelFromAsset(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_labels(asset)string[] method call against the AssetLabeling contract + */ + getAssetLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_labels(asset)string[]', v)) + return this + }, + /** + * Add a get_assets_labels(uint64[])string[][] method call against the AssetLabeling contract + */ + getAssetsLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_assets_labels(uint64[])string[][]', v)) + return this + }, + /** + * Add a get_asset_micro(uint64)(string,uint8) method call against the AssetLabeling contract + */ + getAssetMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetMicro(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_micro(uint64)(string,uint8)', v)) + return this + }, + /** + * Add a get_assets_micro(uint64[])void method call against the AssetLabeling contract + */ + getAssetsMicro(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsMicro(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_micro_labels(uint64)(string,uint8,string[]) method call against the AssetLabeling contract + */ + getAssetMicroLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetMicroLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_micro_labels(uint64)(string,uint8,string[])', v)) + return this + }, + /** + * Add a get_assets_micro_labels(uint64[])void method call against the AssetLabeling contract + */ + getAssetsMicroLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsMicroLabels(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_text(uint64)(string,string,string,string[]) method call against the AssetLabeling contract + */ + getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetText(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string,string[])', v)) + return this + }, + /** + * Add a get_assets_text(uint64[])void method call against the AssetLabeling contract + */ + getAssetsText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsText(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) method call against the AssetLabeling contract + */ + getAssetSmall(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetSmall(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])', v)) + return this + }, + /** + * Add a get_assets_small(uint64[])void method call against the AssetLabeling contract + */ + getAssetsSmall(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsSmall(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]) method call against the AssetLabeling contract + */ + getAssetFull(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetFull(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])', v)) + return this + }, + /** + * Add a get_assets_full(uint64[])void method call against the AssetLabeling contract + */ + getAssetsFull(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsFull(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a clear state call to the AssetLabeling contract + */ + clearState(params: AppClientBareCallParams) { + promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params))) + return this + }, + addTransaction(txn: Transaction, signer?: TransactionSigner) { + promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer)) + return this + }, + async composer() { + await promiseChain + return composer + }, + async simulate(options?: SimulateOptions) { + await promiseChain + const result = await (!options ? composer.simulate() : composer.simulate(options)) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + }, + async send(params?: SendParams) { + await promiseChain + const result = await composer.send(params) + return { + ...result, + returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue) + } + } + } as unknown as AssetLabelingComposer + } +} +export type AssetLabelingComposer = { + /** + * Calls the change_admin(account)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + changeAdmin(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['change_admin(account)void'] | undefined]> + + /** + * Calls the add_label(string,string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_label(string,string)void'] | undefined]> + + /** + * Calls the remove_label(string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + removeLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_label(string)void'] | undefined]> + + /** + * Calls the get_label(string)(string,uint64,uint64) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_label(string)(string,uint64,uint64)'] | undefined]> + + /** + * Calls the log_labels(string[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + logLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['log_labels(string[])void'] | undefined]> + + /** + * Calls the add_operator_to_label(account,string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addOperatorToLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_operator_to_label(account,string)void'] | undefined]> + + /** + * Calls the remove_operator_from_label(account,string)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + removeOperatorFromLabel(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_operator_from_label(account,string)void'] | undefined]> + + /** + * Calls the get_operator_labels(account)string[] ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getOperatorLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_operator_labels(account)string[]'] | undefined]> + + /** + * Calls the add_label_to_asset(string,asset)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + addLabelToAsset(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['add_label_to_asset(string,asset)void'] | undefined]> + + /** + * Calls the remove_label_from_asset(string,asset)void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + removeLabelFromAsset(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['remove_label_from_asset(string,asset)void'] | undefined]> + + /** + * Calls the get_asset_labels(asset)string[] ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_labels(asset)string[]'] | undefined]> + + /** + * Calls the get_assets_labels(uint64[])string[][] ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_labels(uint64[])string[][]'] | undefined]> + + /** + * Calls the get_asset_micro(uint64)(string,uint8) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_micro(uint64)(string,uint8)'] | undefined]> + + /** + * Calls the get_assets_micro(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsMicro(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro(uint64[])void'] | undefined]> + + /** + * Calls the get_asset_micro_labels(uint64)(string,uint8,string[]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_micro_labels(uint64)(string,uint8,string[])'] | undefined]> + + /** + * Calls the get_assets_micro_labels(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] | undefined]> + + /** + * Calls the get_asset_text(uint64)(string,string,string,string[]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] | undefined]> + + /** + * Calls the get_assets_text(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_text(uint64[])void'] | undefined]> + + /** + * Calls the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetSmall(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] | undefined]> + + /** + * Calls the get_assets_small(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsSmall(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_small(uint64[])void'] | undefined]> + + /** + * Calls the get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetFull(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] | undefined]> + + /** + * Calls the get_assets_full(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsFull(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_full(uint64[])void'] | undefined]> + + /** + * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + clearState(params?: AppClientBareCallParams): AssetLabelingComposer<[...TReturns, undefined]> + + /** + * Adds a transaction to the composer + * + * @param txn A transaction to add to the transaction group + * @param signer The optional signer to use when signing this transaction. + */ + addTransaction(txn: Transaction, signer?: TransactionSigner): AssetLabelingComposer + /** + * Returns the underlying AtomicTransactionComposer instance + */ + composer(): Promise + /** + * Simulates the transaction group and returns the result + */ + simulate(): Promise & { simulateResponse: SimulateResponse }> + simulate(options: SkipSignaturesSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + simulate(options: RawSimulateOptions): Promise & { simulateResponse: SimulateResponse }> + /** + * Sends the transaction group to the network and returns the results + */ + send(params?: SendParams): Promise> +} +export type AssetLabelingComposerResults = Expand + diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index 59dac63..d8836c9 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -17,6 +17,7 @@ from algopy.arc4 import abimethod from .types import ( + AssetFull, AssetMicro, AssetMicroLabels, AssetSmall, @@ -373,3 +374,38 @@ def get_asset_small(self, asset: UInt64) -> AssetSmall: def get_assets_small(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: for _i, asset_id in uenumerate(assets): log(self._get_asset_small(asset_id.native)) + + # full (3 refs, max 42) + + @subroutine + def _get_asset_full(self, asset_id: UInt64) -> AssetFull: + asset = Asset(asset_id) + reserve_acct = Account(asset.reserve.bytes) + reserve_balance = ( + asset.balance(reserve_acct) + if reserve_acct.is_opted_in(asset) + else UInt64(0) + ) + return AssetFull( + name=b2str(asset.name), + unit_name=b2str(asset.unit_name), + url=b2str(asset.url), + total=arc4.UInt64(asset.total), + decimals=arc4.UInt8(asset.decimals), + manager=arc4.Address(asset.manager), + freeze=arc4.Address(asset.freeze), + clawback=arc4.Address(asset.clawback), + reserve=arc4.Address(asset.reserve), + reserve_balance=arc4.UInt64(reserve_balance), + metadata_hash=arc4.DynamicBytes(asset.metadata_hash), + labels=self.assets[asset].copy() if asset in self.assets else empty_list(), + ) + + @abimethod(readonly=True) + def get_asset_full(self, asset: UInt64) -> AssetFull: + return self._get_asset_full(asset) + + @abimethod(readonly=True) + def get_assets_full(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + for _i, asset_id in uenumerate(assets): + log(self._get_asset_full(asset_id.native)) diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py index 9535c44..a34d8a7 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py @@ -44,3 +44,21 @@ class AssetSmall(arc4.Struct): # Full view, everything from algod /v2/assets API + reserve balance +class AssetFull(arc4.Struct): + name: arc4.String + unit_name: arc4.String + url: arc4.String + + total: arc4.UInt64 + decimals: arc4.UInt8 + + manager: arc4.Address + freeze: arc4.Address + clawback: arc4.Address + reserve: arc4.Address + + metadata_hash: arc4.DynamicBytes + + reserve_balance: arc4.UInt64 + + labels: LabelList From 22e9b77c6915fe3e0286972800e2074b49aff229 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Wed, 2 Apr 2025 19:48:52 +0300 Subject: [PATCH 13/15] assets full view --- .../artifacts/AssetLabeling.arc32.json | 229 ++++++- projects/abel-sdk-v2/cli/.appid | 2 +- projects/abel-sdk-v2/cli/get-full.ts | 43 ++ projects/abel-sdk-v2/cli/get-micro.ts | 2 +- projects/abel-sdk-v2/cli/get-small.ts | 43 ++ projects/abel-sdk-v2/cli/get-text.ts | 43 ++ .../src/generated/abel-contract-client.ts | 598 +++++++++++++++++- projects/abel-sdk-v2/src/index.ts | 49 +- .../AssetLabeling.approval.puya.map | 383 ++++++----- .../AssetLabeling.approval.teal | 18 +- .../asset_labeling/AssetLabeling.arc56.json | 18 +- .../asset_labeling/AssetLabelingClient.ts | 58 +- .../smart_contracts/asset_labeling/types.py | 2 +- 13 files changed, 1239 insertions(+), 249 deletions(-) create mode 100644 projects/abel-sdk-v2/cli/get-full.ts create mode 100644 projects/abel-sdk-v2/cli/get-small.ts create mode 100644 projects/abel-sdk-v2/cli/get-text.ts diff --git a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json index 28f50b8..f441301 100644 --- a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json +++ b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json @@ -141,10 +141,159 @@ "call_config": { "no_op": "CALL" } + }, + "get_asset_text(uint64)(string,string,string[],string)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetText", + "elements": [ + [ + "name", + "string" + ], + [ + "unit_name", + "string" + ], + [ + "labels", + "string[]" + ], + [ + "url", + "string" + ] + ] + } + } + }, + "get_assets_text(uint64[])void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + }, + "get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetSmall", + "elements": [ + [ + "name", + "string" + ], + [ + "unit_name", + "string" + ], + [ + "decimals", + "uint8" + ], + [ + "total", + "uint64" + ], + [ + "has_freeze", + "bool" + ], + [ + "has_clawback", + "bool" + ], + [ + "labels", + "string[]" + ] + ] + } + } + }, + "get_assets_small(uint64[])void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + }, + "get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetFull", + "elements": [ + [ + "name", + "string" + ], + [ + "unit_name", + "string" + ], + [ + "url", + "string" + ], + [ + "total", + "uint64" + ], + [ + "decimals", + "uint8" + ], + [ + "manager", + "address" + ], + [ + "freeze", + "address" + ], + [ + "clawback", + "address" + ], + [ + "reserve", + "address" + ], + [ + "metadata_hash", + "byte[]" + ], + [ + "reserve_balance", + "uint64" + ], + [ + "labels", + "string[]" + ] + ] + } + } + }, + "get_assets_full(uint64[])void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1IDB4MDAwMCAiIiAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjEKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IDB4NjM1YmUzNjIgMHg3MDkzYjEwZCAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJsb2dfbGFiZWxzKHN0cmluZ1tdKXZvaWQiLCBtZXRob2QgImFkZF9vcGVyYXRvcl90b19sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfb3BlcmF0b3JfbGFiZWxzKGFjY291bnQpc3RyaW5nW10iLCBtZXRob2QgImFkZF9sYWJlbF90b19hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9sYWJlbHMoYXNzZXQpc3RyaW5nW10iLCBtZXRob2QgImdldF9hc3NldHNfbGFiZWxzKHVpbnQ2NFtdKXN0cmluZ1tdW10iLCBtZXRob2QgImdldF9hc3NldF9taWNybyh1aW50NjQpKHN0cmluZyx1aW50OCkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm8odWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyh1aW50NjQpKHN0cmluZyx1aW50OCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm9fbGFiZWxzKHVpbnQ2NFtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1IG1haW5fYWRkX2xhYmVsX3JvdXRlQDYgbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANyBtYWluX2dldF9sYWJlbF9yb3V0ZUA4IG1haW5fbG9nX2xhYmVsc19yb3V0ZUA5IG1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwIG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTEgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1IG1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTYgbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTcgbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4IG1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOSBtYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwCgptYWluX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNybwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWljcm8KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYtMzcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29ubHkoKSAtPiB2b2lkOgphZG1pbl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuY2hhbmdlX2FkbWluKG5ld19hZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmNoYW5nZV9hZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1My01NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgY2hhbmdlX2FkbWluKHNlbGYsIG5ld19hZG1pbjogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW4gPSBuZXdfYWRtaW4KICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsKGlkOiBieXRlcywgbmFtZTogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OC01OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcsIG5hbWU6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjEKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2My02NwogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OS03MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzIKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgYnl0ZWMgMTAgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBkZWwgc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2xhYmVsKGlkOiBieXRlcykgLT4gYnl0ZXM6CmdldF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBMYWJlbERlc2NyaXB0b3I6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyByZXR1cm4gc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmxvZ19sYWJlbHMoaWRzOiBieXRlcykgLT4gdm9pZDoKbG9nX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGxvZ19sYWJlbHMoc2VsZiwgaWRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKbG9nX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gbG9nKHNlbGYubGFiZWxzW2xhYmVsX2lkLm5hdGl2ZV0pCiAgICBleHRyYWN0IDIgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGxvZ19sYWJlbHNfZm9yX2hlYWRlckAxCgpsb2dfbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkbWluX29yX29wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODktOTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkyCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTMKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NS05NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBvcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OS0xMDAKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OC0xMDAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNC0xMDUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjEtMTIyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjYtMTI3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxLTEzMgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MS0xNDIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Mi0xNTMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3LTE1OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzLTE2NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMtMTc2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Mi0xODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYtMTg3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4LTE5OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5LTIyMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjEtMjIzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNi0yMTcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjYtMjI3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NS0yNTcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxLTI0MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MC0yNjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3LTI3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODktMjkyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OC0yOTkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDUtMzA2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBwdXNoYnl0ZXMgMHgwMDA1CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNAogICAgLy8gYW0ubGFiZWxzID0gc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUKICAgIC8vIHJldHVybiBhbQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNy0zMTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIzCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -402,6 +551,84 @@ "returns": { "type": "void" } + }, + { + "name": "get_asset_text", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "readonly": true, + "returns": { + "type": "(string,string,string[],string)" + } + }, + { + "name": "get_assets_text", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "readonly": true, + "returns": { + "type": "void" + } + }, + { + "name": "get_asset_small", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "readonly": true, + "returns": { + "type": "(string,string,uint8,uint64,bool,bool,string[])" + } + }, + { + "name": "get_assets_small", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "readonly": true, + "returns": { + "type": "void" + } + }, + { + "name": "get_asset_full", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "readonly": true, + "returns": { + "type": "(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])" + } + }, + { + "name": "get_assets_full", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "readonly": true, + "returns": { + "type": "void" + } } ], "networks": {} diff --git a/projects/abel-sdk-v2/cli/.appid b/projects/abel-sdk-v2/cli/.appid index f68ae3d..e9ec79e 100644 --- a/projects/abel-sdk-v2/cli/.appid +++ b/projects/abel-sdk-v2/cli/.appid @@ -1 +1 @@ -5104 \ No newline at end of file +5117 \ No newline at end of file diff --git a/projects/abel-sdk-v2/cli/get-full.ts b/projects/abel-sdk-v2/cli/get-full.ts new file mode 100644 index 0000000..da51b1c --- /dev/null +++ b/projects/abel-sdk-v2/cli/get-full.ts @@ -0,0 +1,43 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +const start = BigInt(process.argv[2]) +const len = parseInt(process.argv[3], 10) +const concurrency = parseInt(process.argv[4] ?? "2", 10) + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); + +const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) +const startTs = Date.now(); +const assets = await sdk.getAssetsFull(aids); +const endTs = Date.now() +console.log(...assets.values()); +console.log(endTs - startTs, 'ms'); +console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/get-micro.ts b/projects/abel-sdk-v2/cli/get-micro.ts index 0ea55c5..f87ceb6 100644 --- a/projects/abel-sdk-v2/cli/get-micro.ts +++ b/projects/abel-sdk-v2/cli/get-micro.ts @@ -36,7 +36,7 @@ const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency } const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) const startTs = Date.now(); -const assets = await sdk.getAssetMicro(aids); +const assets = await sdk.getAssetsMicro(aids); const endTs = Date.now() console.log(...assets.values()); console.log(endTs - startTs, 'ms'); diff --git a/projects/abel-sdk-v2/cli/get-small.ts b/projects/abel-sdk-v2/cli/get-small.ts new file mode 100644 index 0000000..a793b25 --- /dev/null +++ b/projects/abel-sdk-v2/cli/get-small.ts @@ -0,0 +1,43 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +const start = BigInt(process.argv[2]) +const len = parseInt(process.argv[3], 10) +const concurrency = parseInt(process.argv[4] ?? "2", 10) + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); + +const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) +const startTs = Date.now(); +const assets = await sdk.getAssetsSmall(aids); +const endTs = Date.now() +console.log(...assets.values()); +console.log(endTs - startTs, 'ms'); +console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/get-text.ts b/projects/abel-sdk-v2/cli/get-text.ts new file mode 100644 index 0000000..e14cdeb --- /dev/null +++ b/projects/abel-sdk-v2/cli/get-text.ts @@ -0,0 +1,43 @@ +import { writeFileSync } from "fs"; +import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; +import { Config } from "@algorandfoundation/algokit-utils"; + +const start = BigInt(process.argv[2]) +const len = parseInt(process.argv[3], 10) +const concurrency = parseInt(process.argv[4] ?? "2", 10) + +const algorand = AlgorandClient.fromEnvironment(); +const deployer = await algorand.account.fromEnvironment("DEPLOYER"); + +const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { + defaultSender: deployer.addr, +}); + +const { appClient, result } = await factory.deploy({ + createParams: { + extraProgramPages: 3, + }, + onUpdate: "append", + onSchemaBreak: "append", +}); + +// If app was just created fund the app account +if (["create", "replace"].includes(result.operationPerformed)) { + await algorand.send.payment({ + amount: (0.1).algo(), + sender: deployer.addr, + receiver: appClient.appAddress, + }); +} + +const { appId } = appClient; +const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); + +const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) +const startTs = Date.now(); +const assets = await sdk.getAssetsText(aids); +const endTs = Date.now() +console.log(...assets.values()); +console.log(endTs - startTs, 'ms'); +console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts index 2b0f22c..d6dc70b 100644 --- a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts +++ b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro_labels","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA0Mjk0OTY3Mjk1IDQyOTQ5NjcyOTYKICAgIGJ5dGVjYmxvY2sgIkVSUjpOT0VYSVNUIiAweDE1MWY3Yzc1IDB4MDAwMCAiIiAiYWRtaW4iICJFUlI6RVhJU1RTIiAweDAwMDIgIkVSUjpVTkFVVEgiICJFUlI6TEVOR1RIIiAweDAwMDAwMDAwMDAwMDAwMDAgIkVSUjpOT0VNUFRZIiAweDAwMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5hZG1pbiA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjEKICAgIHB1c2hieXRlc3MgMHg4ZjBkN2Q4ZSAweDdjMWIzMmY2IDB4MTdlNjkxYWUgMHgzM2QwZmZkYyAweDcyNTYxNmU3IDB4ZmFjMWNmMWIgMHhiNGM1MGI5ZiAweGEyZGQyMjQ3IDB4YTM3ZGVhMTEgMHg2OGYxOGVmYSAweGMyZWQ3NDNmIDB4YTY3ZjAzYzIgMHhhYWVlMGM2MSAweGI2YzM5ZjY4IDB4NjM1YmUzNjIgMHg3MDkzYjEwZCAvLyBtZXRob2QgImNoYW5nZV9hZG1pbihhY2NvdW50KXZvaWQiLCBtZXRob2QgImFkZF9sYWJlbChzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9sYWJlbChzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZ2V0X2xhYmVsKHN0cmluZykoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJsb2dfbGFiZWxzKHN0cmluZ1tdKXZvaWQiLCBtZXRob2QgImFkZF9vcGVyYXRvcl90b19sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChhY2NvdW50LHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfb3BlcmF0b3JfbGFiZWxzKGFjY291bnQpc3RyaW5nW10iLCBtZXRob2QgImFkZF9sYWJlbF90b19hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc3RyaW5nLGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9sYWJlbHMoYXNzZXQpc3RyaW5nW10iLCBtZXRob2QgImdldF9hc3NldHNfbGFiZWxzKHVpbnQ2NFtdKXN0cmluZ1tdW10iLCBtZXRob2QgImdldF9hc3NldF9taWNybyh1aW50NjQpKHN0cmluZyx1aW50OCkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm8odWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyh1aW50NjQpKHN0cmluZyx1aW50OCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfbWljcm9fbGFiZWxzKHVpbnQ2NFtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1IG1haW5fYWRkX2xhYmVsX3JvdXRlQDYgbWFpbl9yZW1vdmVfbGFiZWxfcm91dGVANyBtYWluX2dldF9sYWJlbF9yb3V0ZUA4IG1haW5fbG9nX2xhYmVsc19yb3V0ZUA5IG1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwIG1haW5fcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfcm91dGVAMTEgbWFpbl9nZXRfb3BlcmF0b3JfbGFiZWxzX3JvdXRlQDEyIG1haW5fYWRkX2xhYmVsX3RvX2Fzc2V0X3JvdXRlQDEzIG1haW5fcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfcm91dGVAMTQgbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1IG1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTYgbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTcgbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4IG1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOSBtYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwCgptYWluX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX21pY3JvX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNybwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWljcm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWljcm8KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19sYWJlbHNfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2xhYmVscwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbGFiZWxzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfbGFiZWxfdG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX29wZXJhdG9yX3RvX2xhYmVsX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX29wZXJhdG9yX3RvX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2xvZ19sYWJlbHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYtMzcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29ubHkoKSAtPiB2b2lkOgphZG1pbl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCBTKCJFUlI6VU5BVVRIIikpCiAgICBieXRlYyA3IC8vICJFUlI6VU5BVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkbWluX29ubHlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuY2hhbmdlX2FkbWluKG5ld19hZG1pbjogYnl0ZXMpIC0+IHZvaWQ6CmNoYW5nZV9hZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1My01NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgY2hhbmdlX2FkbWluKHNlbGYsIG5ld19hZG1pbjogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTYKICAgIC8vIHNlbGYuYWRtaW4gPSBuZXdfYWRtaW4KICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsKGlkOiBieXRlcywgbmFtZTogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1OC01OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcsIG5hbWU6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjEKICAgIC8vIGVuc3VyZShpZCBub3QgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpFWElTVFMiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2My02NwogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OS03MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzIKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMKICAgIC8vIGVuc3VyZShpZC5ieXRlcy5sZW5ndGggPT0gMiwgUygiRVJSOkxFTkdUSCIpKQogICAgYnl0ZWMgOCAvLyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgYnl0ZWMgMTAgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBkZWwgc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2xhYmVsKGlkOiBieXRlcykgLT4gYnl0ZXM6CmdldF9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBMYWJlbERlc2NyaXB0b3I6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpnZXRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyByZXR1cm4gc2VsZi5sYWJlbHNbaWRdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmxvZ19sYWJlbHMoaWRzOiBieXRlcykgLT4gdm9pZDoKbG9nX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGxvZ19sYWJlbHMoc2VsZiwgaWRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZm9yIF9pZHgsIGxhYmVsX2lkIGluIHVlbnVtZXJhdGUoaWRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKbG9nX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gbG9nKHNlbGYubGFiZWxzW2xhYmVsX2lkLm5hdGl2ZV0pCiAgICBleHRyYWN0IDIgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGxvZ19sYWJlbHNfZm9yX2hlYWRlckAxCgpsb2dfbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkbWluX29yX29wZXJhdG9yX29ubHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODktOTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjkyCiAgICAvLyByZXR1cm4KICAgIHJldHN1YgoKYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTMKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5NS05NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBvcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDAKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OS0xMDAKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OC0xMDAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNC0xMDUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjXzMgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjEtMTIyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjYtMTI3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxLTEzMgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0MS0xNDIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18wIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1Mi0xNTMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTUxLTE1MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzAgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU3LTE1OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYzLTE2NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzMtMTc2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Mi0xODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODYtMTg3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk4LTE5OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5LTIyMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjEtMjIzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50Y18zIC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNi0yMTcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjYtMjI3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMCAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NS0yNTcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQxLTI0MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0MS0yNDMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MC0yNjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjY3LTI3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODktMjkyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5OC0yOTkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDUtMzA2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBwdXNoYnl0ZXMgMHgwMDA1CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgtMzEyCiAgICAvLyBhbSA9IEFzc2V0TWljcm9MYWJlbHMoCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbGFiZWxzPWVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNAogICAgLy8gYW0ubGFiZWxzID0gc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUKICAgIC8vIHJldHVybiBhbQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNy0zMTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX21pY3JvX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIzCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"labels","type":"string[]"},{"name":"url","type":"string"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro_labels","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_text","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,string[],string)","struct":"AssetText"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_text","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_small","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_small","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_full","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_full","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract /** * A state record containing binary data @@ -106,6 +106,62 @@ export function AssetMicroLabelsFromTuple(abiTuple: [string, number, string[]]) return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetMicroLabels, APP_SPEC.structs) as AssetMicroLabels } +export type AssetText = { + name: string, + unitName: string, + labels: string[], + url: string +} + + +/** + * Converts the ABI tuple representation of a AssetText to the struct representation + */ +export function AssetTextFromTuple(abiTuple: [string, string, string[], string]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetText, APP_SPEC.structs) as AssetText +} + +export type AssetSmall = { + name: string, + unitName: string, + decimals: number, + total: bigint, + hasFreeze: boolean, + hasClawback: boolean, + labels: string[] +} + + +/** + * Converts the ABI tuple representation of a AssetSmall to the struct representation + */ +export function AssetSmallFromTuple(abiTuple: [string, string, number, bigint, boolean, boolean, string[]]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetSmall, APP_SPEC.structs) as AssetSmall +} + +export type AssetFull = { + name: string, + unitName: string, + url: string, + total: bigint, + decimals: number, + manager: string, + freeze: string, + clawback: string, + reserve: string, + metadataHash: Uint8Array, + reserveBalance: bigint, + labels: string[] +} + + +/** + * Converts the ABI tuple representation of a AssetFull to the struct representation + */ +export function AssetFullFromTuple(abiTuple: [string, string, string, bigint, number, string, string, string, string, Uint8Array, bigint, string[]]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetFull, APP_SPEC.structs) as AssetFull +} + /** * The argument types for the AssetLabeling contract */ @@ -167,6 +223,24 @@ export type AssetLabelingArgs = { 'get_assets_micro_labels(uint64[])void': { assets: bigint[] | number[] } + 'get_asset_text(uint64)(string,string,string[],string)': { + asset: bigint | number + } + 'get_assets_text(uint64[])void': { + assets: bigint[] | number[] + } + 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': { + asset: bigint | number + } + 'get_assets_small(uint64[])void': { + assets: bigint[] | number[] + } + 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': { + asset: bigint | number + } + 'get_assets_full(uint64[])void': { + assets: bigint[] | number[] + } } /** * The tuple representation of the arguments for each method @@ -188,6 +262,12 @@ export type AssetLabelingArgs = { 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] 'get_asset_micro_labels(uint64)(string,uint8,string[])': [asset: bigint | number] 'get_assets_micro_labels(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_text(uint64)(string,string,string[],string)': [asset: bigint | number] + 'get_assets_text(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': [asset: bigint | number] + 'get_assets_small(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': [asset: bigint | number] + 'get_assets_full(uint64[])void': [assets: bigint[] | number[]] } } @@ -211,6 +291,12 @@ export type AssetLabelingReturns = { 'get_assets_micro(uint64[])void': void 'get_asset_micro_labels(uint64)(string,uint8,string[])': AssetMicroLabels 'get_assets_micro_labels(uint64[])void': void + 'get_asset_text(uint64)(string,string,string[],string)': AssetText + 'get_assets_text(uint64[])void': void + 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': AssetSmall + 'get_assets_small(uint64[])void': void + 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': AssetFull + 'get_assets_full(uint64[])void': void } /** @@ -301,6 +387,36 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_assets_micro_labels(uint64[])void'] returns: AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] }> + & Record<'get_asset_text(uint64)(string,string,string[],string)' | 'get_asset_text', { + argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string[],string)'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string[],string)'] + returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] + }> + & Record<'get_assets_text(uint64[])void' | 'get_assets_text', { + argsObj: AssetLabelingArgs['obj']['get_assets_text(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_text(uint64[])void'] + returns: AssetLabelingReturns['get_assets_text(uint64[])void'] + }> + & Record<'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])' | 'get_asset_small', { + argsObj: AssetLabelingArgs['obj']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + returns: AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + }> + & Record<'get_assets_small(uint64[])void' | 'get_assets_small', { + argsObj: AssetLabelingArgs['obj']['get_assets_small(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_small(uint64[])void'] + returns: AssetLabelingReturns['get_assets_small(uint64[])void'] + }> + & Record<'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])' | 'get_asset_full', { + argsObj: AssetLabelingArgs['obj']['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + returns: AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + }> + & Record<'get_assets_full(uint64[])void' | 'get_assets_full', { + argsObj: AssetLabelingArgs['obj']['get_assets_full(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_full(uint64[])void'] + returns: AssetLabelingReturns['get_assets_full(uint64[])void'] + }> /** * Defines the shape of the state of the application. */ @@ -575,6 +691,84 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.assets], } } + /** + * Constructs a no op call for the get_asset_text(uint64)(string,string,string[],string) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_text(uint64)(string,string,string[],string)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_text(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_text(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } + /** + * Constructs a no op call for the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetSmall(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_small(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsSmall(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_small(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } + /** + * Constructs a no op call for the get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetFull(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_full(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsFull(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_full(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } } /** @@ -993,6 +1187,78 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetFull(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsFull(params)) + }, + } /** @@ -1187,6 +1453,78 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsMicroLabels(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsText(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsSmall: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetFull(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsFull: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsFull(params)) + }, + } /** @@ -1397,6 +1735,84 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_micro_labels(uint64[])void'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsText(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_text(uint64[])void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetSmall: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetSmall(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsSmall: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_small(uint64[])void'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetFull: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetFull(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsFull: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsFull(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_full(uint64[])void'])} + }, + } /** @@ -1526,6 +1942,84 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetText(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_text(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsText(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsText(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_text(uint64[])void'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetSmall(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetSmall(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_small(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsSmall(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsSmall(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_small(uint64[])void'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetFull(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetFull(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_full(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsFull(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsFull(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_full(uint64[])void'] + } + /** * Methods to access state for the current AssetLabeling app */ @@ -1684,6 +2178,54 @@ export class AssetLabelingClient { resultMappers.push(undefined) return this }, + /** + * Add a get_asset_text(uint64)(string,string,string[],string) method call against the AssetLabeling contract + */ + getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetText(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string[],string)', v)) + return this + }, + /** + * Add a get_assets_text(uint64[])void method call against the AssetLabeling contract + */ + getAssetsText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsText(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) method call against the AssetLabeling contract + */ + getAssetSmall(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetSmall(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])', v)) + return this + }, + /** + * Add a get_assets_small(uint64[])void method call against the AssetLabeling contract + */ + getAssetsSmall(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsSmall(params))) + resultMappers.push(undefined) + return this + }, + /** + * Add a get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]) method call against the AssetLabeling contract + */ + getAssetFull(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetFull(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])', v)) + return this + }, + /** + * Add a get_assets_full(uint64[])void method call against the AssetLabeling contract + */ + getAssetsFull(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsFull(params))) + resultMappers.push(undefined) + return this + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -1863,6 +2405,60 @@ export type AssetLabelingComposer = { */ getAssetsMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] | undefined]> + /** + * Calls the get_asset_text(uint64)(string,string,string[],string) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] | undefined]> + + /** + * Calls the get_assets_text(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_text(uint64[])void'] | undefined]> + + /** + * Calls the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetSmall(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] | undefined]> + + /** + * Calls the get_assets_small(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsSmall(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_small(uint64[])void'] | undefined]> + + /** + * Calls the get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetFull(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])'] | undefined]> + + /** + * Calls the get_assets_full(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsFull(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_full(uint64[])void'] | undefined]> + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index dc2c185..7fe3606 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -9,6 +9,9 @@ import { AssetMicro, AssetMicroFromTuple, AssetMicroLabelsFromTuple, + AssetSmallFromTuple, + AssetTextFromTuple, + AssetFullFromTuple, LabelDescriptorFromTuple as LabelDescriptorBoxValueFromTuple, } from "./generated/abel-contract-client.js"; import { AnyFn, FirstArgument, LabelDescriptor } from "./types.js"; @@ -268,7 +271,6 @@ export class AbelSDK { return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); }; - getAssetsMicroLabels = async (assetIds: bigint[]): Promise> => { const METHOD_MAX = 64; if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsMicroLabels, assetIds, METHOD_MAX); @@ -284,6 +286,51 @@ export class AbelSDK { return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); }; + getAssetsText = async (assetIds: bigint[]): Promise> => { + const METHOD_MAX = 64; + if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsText, assetIds, METHOD_MAX); + + const { confirmations } = await wrapErrors( + this.readClient + .newGroup() + .getAssetsText({ args: { assets: assetIds } }) + .simulate(SIMULATE_PARAMS) + ); + + const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetMicroLabelsFromTuple, "get_asset_text"); + return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); + }; + + getAssetsSmall = async (assetIds: bigint[]): Promise> => { + const METHOD_MAX = 64; + if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsSmall, assetIds, METHOD_MAX); + + const { confirmations } = await wrapErrors( + this.readClient + .newGroup() + .getAssetsSmall({ args: { assets: assetIds } }) + .simulate(SIMULATE_PARAMS) + ); + + const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetSmallFromTuple, "get_asset_small"); + return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); + }; + + getAssetsFull = async (assetIds: bigint[]): Promise> => { + const METHOD_MAX = 42; + if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsFull, assetIds, METHOD_MAX); + + const { confirmations } = await wrapErrors( + this.readClient + .newGroup() + .getAssetsFull({ args: { assets: assetIds } }) + .simulate(SIMULATE_PARAMS) + ); + + const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetFullFromTuple, "get_asset_full"); + return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); + }; + /* Utils */ private async getBoxesByLength(length: number): Promise { diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map index cc4db02..60f90d6 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map @@ -3,7 +3,7 @@ "sources": [ "../../asset_labeling/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDQ;;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAqWK;;AAAA;AAAA;AAAA;;AAAA;AArWL;;;AAqWK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjWL;;;AAAA;AAiWK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAlUL;;;AAkUK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA9TL;;;AAAA;AA8TK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AApBA;;AAAA;AAAA;AAAA;;AAAA;AA1SL;;;AA0SK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAtSL;;;AAAA;AAsSK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AArRL;;;AAqRK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjRL;;;AAAA;AAiRK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AAjQL;;;AAiQK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA7PL;;;AAAA;AA6PK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA3BA;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALA;;;AAEW;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAP;AAaW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAzBR;;;AAyBkC;;AAxBjC;AACA;;AAyBR;;;AAEQ;;;AACA;;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AAnCR;;;AAmC+B;;AAlC9B;AACA;AAkCO;;AAAA;AAAmB;AAAnB;AApCR;;;AAoC8B;;AAnC7B;AACA;AAoCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9CR;;;AA8C2B;AA7C1B;AACA;AA6CO;;AAAA;AAAmB;AAAnB;AA/CR;;;AA+C8B;;AA9C7B;AACA;AA8CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAhDR;;;AAgDyC;;AA/CxC;AACA;AA+CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AArDR;;;AAqD2B;AApD1B;AACA;AAoDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;;AADC;AADJ;;;;AAxEL;;;AA2EK;;AA1EJ;AACA;;;;;;AA4ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA1FR;;;AA0F8B;AAzF7B;AACA;AA0FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;;AADH;AA/FT;;;AAiGS;;AAhGR;AACA;AAmGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAvHR;;;AAuH8B;AAtH7B;AACA;AAsHO;;AAAA;AAAA;;AAxHR;;;AAwHoC;AAvHnC;AACA;AAyHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA7HL;;;AAgIK;AA/HJ;AACA;AAkImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAtIL;;;AAuIK;;AAtIJ;AACA;AAyII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAxJD;AA0JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA9KR;;;AA8K8B;AA7K7B;AACA;AA8KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;;AAA5C;AArLT;;;AAsLS;;AArLR;AACA;AAwLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA1MR;;;AA0M8B;AAzM7B;AACA;AA0MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAlNT;;AAAA;;;AAiOe;AAhOd;AACA;AAkOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAtOD;AAwOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA;AAQR;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAFN;;;;AAAA;AAAA;AAAA;AAAA;AAAP;AAKR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAC2B;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAHJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAnRG;;;;AAyRX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAC6C;AAA7B;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACA;;AAAA;;AAAA;AAAN;;;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAJJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAvSG;;;;AA8SX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACS;;AAAA;;AAAA;AAAZ;AACe;;AAAA;;AAAA;AAAgB;;AAAhB;AAAV;;;AAAA;AAAA;;AAAA;AACY;;AAAA;;AAAA;AAAkB;;AAAlB;AAAV;;;AAAA;AAAA;;AAAA;AACuB;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAPJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA5TG;;;;AAsUX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;;;;AAG+B;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAGhB;;AAAA;;AAAA;;AADH;;;AAAA;;AAAA;;AAAA;;AAAA;AAKW;;AAAA;;AAAA;AAAN;;;AAAA;;AACW;;AAAA;;AAAA;AAAN;;;AAAA;;AACA;;AAAA;;AAAA;AAAN;;;AAAA;;AACc;;AAAA;;AAAA;AAAZ;AAAA;;AACc;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AACY;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AACE;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AAEW;;AAAA;;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AADE;AAAA;;AAEoB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAZJ;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA1VG;;;;AAwVM;;;;AAiBjB;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDQ;;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAqWK;;AAAA;AAAA;AAAA;;AAAA;AArWL;;;AAqWK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjWL;;;AAAA;AAiWK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAlUL;;;AAkUK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA9TL;;;AAAA;AA8TK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AApBA;;AAAA;AAAA;AAAA;;AAAA;AA1SL;;;AA0SK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAtSL;;;AAAA;AAsSK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AArRL;;;AAqRK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjRL;;;AAAA;AAiRK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AAjQL;;;AAiQK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA7PL;;;AAAA;AA6PK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA3BA;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALA;;;AAEW;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAP;AAaW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAzBR;;;AAyBkC;;AAxBjC;AACA;;AAyBR;;;AAEQ;;;AACA;;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AAnCR;;;AAmC+B;;AAlC9B;AACA;AAkCO;;AAAA;AAAmB;AAAnB;AApCR;;;AAoC8B;;AAnC7B;AACA;AAoCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9CR;;;AA8C2B;AA7C1B;AACA;AA6CO;;AAAA;AAAmB;AAAnB;AA/CR;;;AA+C8B;;AA9C7B;AACA;AA8CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAhDR;;;AAgDyC;;AA/CxC;AACA;AA+CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AArDR;;;AAqD2B;AApD1B;AACA;AAoDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;;AADC;AADJ;;;;AAxEL;;;AA2EK;;AA1EJ;AACA;;;;;;AA4ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA1FR;;;AA0F8B;AAzF7B;AACA;AA0FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;;AADH;AA/FT;;;AAiGS;;AAhGR;AACA;AAmGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAvHR;;;AAuH8B;AAtH7B;AACA;AAsHO;;AAAA;AAAA;;AAxHR;;;AAwHoC;AAvHnC;AACA;AAyHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA7HL;;;AAgIK;AA/HJ;AACA;AAkImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAtIL;;;AAuIK;;AAtIJ;AACA;AAyII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAxJD;AA0JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA9KR;;;AA8K8B;AA7K7B;AACA;AA8KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;;AAA5C;AArLT;;;AAsLS;;AArLR;AACA;AAwLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA1MR;;;AA0M8B;AAzM7B;AACA;AA0MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAlNT;;AAAA;;;AAiOe;AAhOd;AACA;AAkOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAtOD;AAwOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA;AAQR;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAFN;;;;AAAA;AAAA;AAAA;AAAA;AAAP;AAKR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAC2B;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAHJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAnRG;;;;AAyRX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAC6C;AAA7B;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AAE0B;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AADG;;AAAA;;AAAA;AAAN;;;AAHD;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAvSG;;;;AA8SX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACS;;AAAA;;AAAA;AAAZ;AACe;;AAAA;;AAAA;AAAgB;;AAAhB;AAAV;;;AAAA;AAAA;;AAAA;AACY;;AAAA;;AAAA;AAAkB;;AAAlB;AAAV;;;AAAA;AAAA;;AAAA;AACuB;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAPJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA5TG;;;;AAsUX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;;;;AAG+B;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAGhB;;AAAA;;AAAA;;AADH;;;AAAA;;AAAA;;AAAA;;AAAA;AAKW;;AAAA;;AAAA;AAAN;;;AAAA;;AACW;;AAAA;;AAAA;AAAN;;;AAAA;;AACA;;AAAA;;AAAA;AAAN;;;AAAA;;AACc;;AAAA;;AAAA;AAAZ;AAAA;;AACc;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AACY;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AACE;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AAEW;;AAAA;;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AADE;AAAA;;AAEoB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAZJ;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA1VG;;;;AAwVM;;;;AAiBjB;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -69,7 +69,7 @@ "stack_out": [] }, "121": { - "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0xe1bb95fc 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\", method \"get_asset_micro(uint64)(string,uint8)\", method \"get_assets_micro(uint64[])void\", method \"get_asset_micro_labels(uint64)(string,uint8,string[])\", method \"get_assets_micro_labels(uint64[])void\", method \"get_asset_text(uint64)(string,string,string,string[])\", method \"get_assets_text(uint64[])void\", method \"get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])\", method \"get_assets_small(uint64[])void\", method \"get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])\", method \"get_assets_full(uint64[])void\"", + "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0x4f53c25d 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\", method \"get_asset_micro(uint64)(string,uint8)\", method \"get_assets_micro(uint64[])void\", method \"get_asset_micro_labels(uint64)(string,uint8,string[])\", method \"get_assets_micro_labels(uint64[])void\", method \"get_asset_text(uint64)(string,string,string[],string)\", method \"get_assets_text(uint64[])void\", method \"get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])\", method \"get_assets_small(uint64[])void\", method \"get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])\", method \"get_assets_full(uint64[])void\"", "defined_out": [ "Method(add_label(string,string)void)", "Method(add_label_to_asset(string,asset)void)", @@ -80,7 +80,7 @@ "Method(get_asset_micro(uint64)(string,uint8))", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", - "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_asset_text(uint64)(string,string,string[],string))", "Method(get_assets_full(uint64[])void)", "Method(get_assets_labels(uint64[])string[][])", "Method(get_assets_micro(uint64[])void)", @@ -111,7 +111,7 @@ "Method(get_assets_micro(uint64[])void)", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_assets_micro_labels(uint64[])void)", - "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_asset_text(uint64)(string,string,string[],string))", "Method(get_assets_text(uint64[])void)", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", "Method(get_assets_small(uint64[])void)", @@ -131,7 +131,7 @@ "Method(get_asset_micro(uint64)(string,uint8))", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", - "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_asset_text(uint64)(string,string,string[],string))", "Method(get_assets_full(uint64[])void)", "Method(get_assets_labels(uint64[])string[][])", "Method(get_assets_micro(uint64[])void)", @@ -163,7 +163,7 @@ "Method(get_assets_micro(uint64[])void)", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_assets_micro_labels(uint64[])void)", - "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_asset_text(uint64)(string,string,string[],string))", "Method(get_assets_text(uint64[])void)", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", "Method(get_assets_small(uint64[])void)", @@ -16076,32 +16076,7 @@ ] }, "2492": { - "op": "asset_params_get AssetURL", - "defined_out": [ - "check%2#0", - "tmp%0#0", - "tmp%1#0", - "value%2#0" - ], - "stack_out": [ - "tmp%0#0", - "tmp%1#0", - "value%2#0", - "check%2#0" - ] - }, - "2494": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "tmp%0#0", - "tmp%1#0", - "value%2#0" - ] - }, - "2495": { - "callsub": "smart_contracts.asset_labeling.contract.b2str", - "op": "callsub b2str", + "op": "itob", "defined_out": [ "tmp%0#0", "tmp%1#0", @@ -16113,150 +16088,168 @@ "tmp%2#0" ] }, - "2498": { - "op": "frame_dig -1", - "stack_out": [ - "tmp%0#0", - "tmp%1#0", - "tmp%2#0", - "asset_id#0 (copy)" - ] - }, - "2500": { - "op": "itob", - "defined_out": [ - "tmp%0#0", - "tmp%1#0", - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%0#0", - "tmp%1#0", - "tmp%2#0", - "tmp%3#0" - ] - }, - "2501": { + "2493": { "op": "dup", "defined_out": [ "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%3#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "tmp%3#0" + "tmp%2#0" ] }, - "2502": { + "2494": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", "maybe_value%0#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%3#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "maybe_value%0#0", "maybe_exists%0#0" ] }, - "2503": { + "2495": { "op": "bury 1", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "maybe_exists%0#0" ] }, - "2505": { + "2497": { "op": "bz _get_asset_text_ternary_false@2", "stack_out": [ "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%3#0" + "tmp%2#0" ] }, - "2508": { - "op": "frame_dig 3", + "2500": { + "op": "frame_dig 2", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "tmp%3#0" + "tmp%2#0" ] }, - "2510": { + "2502": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", "maybe_value%1#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%3#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "maybe_value%1#0", "maybe_exists%1#0" ] }, - "2511": { + "2503": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "defined_out": [ "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%3#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1" ] }, - "2512": { + "2504": { "block": "_get_asset_text_ternary_merge@3", "stack_in": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1" ], + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "ternary_result%0#1", + "asset_id#0 (copy)" + ] + }, + "2506": { + "op": "asset_params_get AssetURL", + "defined_out": [ + "check%2#0", + "value%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "ternary_result%0#1", + "value%2#0", + "check%2#0" + ] + }, + "2508": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "ternary_result%0#1", + "value%2#0" + ] + }, + "2509": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "ternary_result%0#1", + "tmp%6#0" + ] + }, + "2512": { "op": "frame_dig 0", "defined_out": [ - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0" ] }, @@ -16264,14 +16257,15 @@ "op": "dup", "defined_out": [ "tmp%0#0", - "tmp%0#0 (copy)" + "tmp%0#0 (copy)", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%0#0 (copy)" ] @@ -16280,14 +16274,15 @@ "op": "len", "defined_out": [ "data_length%0#0", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "data_length%0#0" ] @@ -16297,14 +16292,15 @@ "defined_out": [ "8", "data_length%0#0", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "data_length%0#0", "8" @@ -16314,14 +16310,15 @@ "op": "+", "defined_out": [ "current_tail_offset%1#0", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0" ] @@ -16331,14 +16328,15 @@ "defined_out": [ "current_tail_offset%1#0", "current_tail_offset%1#0 (copy)", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "current_tail_offset%1#0 (copy)" @@ -16349,14 +16347,15 @@ "defined_out": [ "as_bytes%1#0", "current_tail_offset%1#0", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "as_bytes%1#0" @@ -16367,14 +16366,15 @@ "defined_out": [ "current_tail_offset%1#0", "offset_as_uint16%1#0", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "offset_as_uint16%1#0" @@ -16386,14 +16386,15 @@ "0x0008", "current_tail_offset%1#0", "offset_as_uint16%1#0", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "offset_as_uint16%1#0", @@ -16406,8 +16407,8 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "0x0008", @@ -16419,14 +16420,15 @@ "defined_out": [ "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", - "tmp%0#0" + "tmp%0#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "encoded_tuple_buffer%2#0" @@ -16438,14 +16440,15 @@ "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0" + "tmp%1#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", @@ -16459,14 +16462,15 @@ "encoded_tuple_buffer%2#0", "tmp%0#0", "tmp%1#0", - "tmp%1#0 (copy)" + "tmp%1#0 (copy)", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", @@ -16480,8 +16484,8 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%1#0", @@ -16496,14 +16500,15 @@ "data_length%1#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0" + "tmp%1#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%1#0", @@ -16517,8 +16522,8 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16532,14 +16537,15 @@ "current_tail_offset%2#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0" + "tmp%1#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16553,14 +16559,15 @@ "current_tail_offset%2#0 (copy)", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0" + "tmp%1#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16575,14 +16582,15 @@ "current_tail_offset%2#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0" + "tmp%1#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16597,14 +16605,15 @@ "encoded_tuple_buffer%2#0", "offset_as_uint16%2#0", "tmp%0#0", - "tmp%1#0" + "tmp%1#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16618,8 +16627,8 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", @@ -16633,8 +16642,8 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", @@ -16648,14 +16657,15 @@ "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", "tmp%0#0", - "tmp%1#0" + "tmp%1#0", + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", @@ -16663,25 +16673,25 @@ ] }, "2547": { - "op": "frame_dig 2", + "op": "uncover 5", "defined_out": [ "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "tmp%2#0" + "ternary_result%0#1" ] }, "2549": { @@ -16689,23 +16699,22 @@ "defined_out": [ "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", + "ternary_result%0#1 (copy)", "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%2#0 (copy)" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "tmp%2#0 (copy)", - "tmp%2#0 (copy)" + "ternary_result%0#1 (copy)", + "ternary_result%0#1 (copy)" ] }, "2550": { @@ -16714,14 +16723,13 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "tmp%2#0 (copy)" + "ternary_result%0#1 (copy)" ] }, "2552": { @@ -16730,19 +16738,19 @@ "current_tail_offset%2#0", "data_length%2#0", "encoded_tuple_buffer%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", "data_length%2#0" @@ -16754,11 +16762,10 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "encoded_tuple_buffer%3#0", "data_length%2#0", "current_tail_offset%2#0" @@ -16769,19 +16776,19 @@ "defined_out": [ "current_tail_offset%3#0", "encoded_tuple_buffer%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "encoded_tuple_buffer%3#0", "current_tail_offset%3#0" ] @@ -16791,19 +16798,19 @@ "defined_out": [ "as_bytes%3#0", "encoded_tuple_buffer%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "encoded_tuple_buffer%3#0", "as_bytes%3#0" ] @@ -16813,19 +16820,19 @@ "defined_out": [ "encoded_tuple_buffer%3#0", "offset_as_uint16%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "encoded_tuple_buffer%3#0", "offset_as_uint16%3#0" ] @@ -16834,19 +16841,19 @@ "op": "concat", "defined_out": [ "encoded_tuple_buffer%4#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "encoded_tuple_buffer%4#0" ] }, @@ -16856,10 +16863,9 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "encoded_tuple_buffer%4#0", "tmp%0#0" ] @@ -16868,18 +16874,18 @@ "op": "concat", "defined_out": [ "encoded_tuple_buffer%5#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "tmp%1#0", - "tmp%2#0", + "ternary_result%0#1", "encoded_tuple_buffer%5#0" ] }, @@ -16889,9 +16895,8 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", + "tmp%6#0", "ternary_result%0#1", - "tmp%2#0", "encoded_tuple_buffer%5#0", "tmp%1#0" ] @@ -16900,17 +16905,17 @@ "op": "concat", "defined_out": [ "encoded_tuple_buffer%6#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", + "tmp%6#0", "ternary_result%0#1", - "tmp%2#0", "encoded_tuple_buffer%6#0" ] }, @@ -16920,10 +16925,9 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "encoded_tuple_buffer%6#0", - "tmp%2#0" + "ternary_result%0#1" ] }, "2568": { @@ -16932,33 +16936,24 @@ "encoded_tuple_buffer%7#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%6#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", - "ternary_result%0#1", + "tmp%6#0", "encoded_tuple_buffer%7#0" ] }, "2569": { "op": "swap", - "defined_out": [ - "encoded_tuple_buffer%7#0", - "ternary_result%0#1", - "tmp%0#0", - "tmp%1#0", - "tmp%2#0" - ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "encoded_tuple_buffer%7#0", - "ternary_result%0#1" + "tmp%6#0" ] }, "2570": { @@ -16966,14 +16961,12 @@ "defined_out": [ "encoded_tuple_buffer%8#0", "tmp%0#0", - "tmp%1#0", - "tmp%2#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "encoded_tuple_buffer%8#0" ] }, @@ -16989,8 +16982,7 @@ "stack_in": [ "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%3#0" + "tmp%2#0" ], "op": "bytec_2 // 0x0000", "defined_out": [ @@ -17000,7 +16992,6 @@ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%3#0", "ternary_result%0#1" ] }, diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal index 621333e..5a5f331 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal @@ -18,7 +18,7 @@ main_after_if_else@2: // class AssetLabeling(ARC4Contract): txn NumAppArgs bz main_bare_routing@27 - pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0xe1bb95fc 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]", method "get_asset_micro(uint64)(string,uint8)", method "get_assets_micro(uint64[])void", method "get_asset_micro_labels(uint64)(string,uint8,string[])", method "get_assets_micro_labels(uint64[])void", method "get_asset_text(uint64)(string,string,string,string[])", method "get_assets_text(uint64[])void", method "get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])", method "get_assets_small(uint64[])void", method "get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])", method "get_assets_full(uint64[])void" + pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0x4f53c25d 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]", method "get_asset_micro(uint64)(string,uint8)", method "get_assets_micro(uint64[])void", method "get_asset_micro_labels(uint64)(string,uint8,string[])", method "get_assets_micro_labels(uint64[])void", method "get_asset_text(uint64)(string,string,string[],string)", method "get_assets_text(uint64[])void", method "get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])", method "get_assets_small(uint64[])void", method "get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])", method "get_assets_full(uint64[])void" txna ApplicationArgs 0 match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 main_get_asset_micro_labels_route@19 main_get_assets_micro_labels_route@20 main_get_asset_text_route@21 main_get_assets_text_route@22 main_get_asset_small_route@23 main_get_assets_small_route@24 main_get_asset_full_route@25 main_get_assets_full_route@26 @@ -2352,12 +2352,6 @@ _get_asset_text: asset_params_get AssetUnitName assert // asset exists callsub b2str - // smart_contracts/asset_labeling/contract.py:341 - // url=b2str(asset.url), - frame_dig -1 - asset_params_get AssetURL - assert // asset exists - callsub b2str // smart_contracts/asset_labeling/contract.py:342 // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), frame_dig -1 @@ -2366,11 +2360,17 @@ _get_asset_text: box_len bury 1 bz _get_asset_text_ternary_false@2 - frame_dig 3 + frame_dig 2 box_get assert // check self.assets entry exists _get_asset_text_ternary_merge@3: + // smart_contracts/asset_labeling/contract.py:341 + // url=b2str(asset.url), + frame_dig -1 + asset_params_get AssetURL + assert // asset exists + callsub b2str // smart_contracts/asset_labeling/contract.py:338-343 // return AssetText( // name=b2str(asset.name), @@ -2401,7 +2401,7 @@ _get_asset_text_ternary_merge@3: uncover 2 swap concat - frame_dig 2 + uncover 5 dup cover 3 len diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json index 8e8f72a..265808e 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json @@ -114,13 +114,13 @@ "name": "unit_name", "type": "string" }, - { - "name": "url", - "type": "string" - }, { "name": "labels", "type": "string[]" + }, + { + "name": "url", + "type": "string" } ], "LabelDescriptor": [ @@ -507,7 +507,7 @@ } ], "returns": { - "type": "(string,string,string,string[])", + "type": "(string,string,string[],string)", "struct": "AssetText" }, "actions": { @@ -736,7 +736,7 @@ 2366, 2478, 2486, - 2494, + 2508, 2635, 2643, 2651, @@ -807,7 +807,7 @@ 2160, 2207, 2389, - 2511, + 2503, 2710, 2976 ], @@ -853,11 +853,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4ZTFiYjk1ZmMgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQyCiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF90ZXh0KGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUtMzQ2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X3RleHQoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRUZXh0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ3CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3RleHQoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c190ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHQoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3RleHRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTYtMzU3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjUKICAgIC8vIGhhc19jbGF3YmFjaz1hcmM0LkJvb2woYXNzZXQuY2xhd2JhY2sgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1OS0zNjcKICAgIC8vIHJldHVybiBBc3NldFNtYWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGhhc19mcmVlemU9YXJjNC5Cb29sKGFzc2V0LmZyZWV6ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDEwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgcHVzaGludCAxMDUgLy8gMTA1CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9zbWFsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFNtYWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcxCiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfc21hbGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfc21hbGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMtMzc0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19zbWFsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc2CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19zbWFsbF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAtMzgxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgzCiAgICAvLyByZXNlcnZlX2FjY3QgPSBBY2NvdW50KGFzc2V0LnJlc2VydmUuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NS0zODcKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgLy8gZWxzZSBVSW50NjQoMCkKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MgogICAgLy8gdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MwogICAgLy8gdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBtYW5hZ2VyPWFyYzQuQWRkcmVzcyhhc3NldC5tYW5hZ2VyKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEwCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk3CiAgICAvLyBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTgKICAgIC8vIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA4CiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAwCiAgICAvLyBtZXRhZGF0YV9oYXNoPWFyYzQuRHluYW1pY0J5dGVzKGFzc2V0Lm1ldGFkYXRhX2hhc2gpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk5CiAgICAvLyByZXNlcnZlX2JhbGFuY2U9YXJjNC5VSW50NjQocmVzZXJ2ZV9iYWxhbmNlKSwKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDUKICAgIGZyYW1lX2RpZyA0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4OS00MDIKICAgIC8vIHJldHVybiBBc3NldEZ1bGwoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICAvLyAgICAgZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgLy8gICAgIGNsYXdiYWNrPWFyYzQuQWRkcmVzcyhhc3NldC5jbGF3YmFjayksCiAgICAvLyAgICAgcmVzZXJ2ZT1hcmM0LkFkZHJlc3MoYXNzZXQucmVzZXJ2ZSksCiAgICAvLyAgICAgcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICAvLyAgICAgbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNTUgLy8gMTU1CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDliCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA5CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDgKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANgoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODcKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNC00MDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfZnVsbChhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfZnVsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfZnVsbF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2Z1bGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0E4buV/ARVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/9xBUSI+f+L/xZJvUUBQQBCiwO+RIsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQiwJJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/vooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==", + "approval": "CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0ET1PCXQRVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/8WSb1FAUEASosCvkSL/3EFRIj58YsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQTwVJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/tooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts index f92d2c4..38b5729 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"labels","type":"string[]"}],"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro_labels","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_text","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,string[])","struct":"AssetText"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_text","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_small","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_small","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_full","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_full","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1107,1546,1565,1990],"errorMessage":"Index access is out of bounds"},{"pc":[287,302,322,337,357,372,392,407,427,442,462,481,503,527,551,573,597,621,636,658,676,700],"errorMessage":"OnCompletion is not NoOp"},{"pc":[2856],"errorMessage":"account opted into asset"},{"pc":[2274,2282,2358,2366,2478,2486,2494,2635,2643,2651,2665,2671,2686,2840,2861,2871,2881,2891,2899,2918,2926,2934,2942,2947],"errorMessage":"asset exists"},{"pc":[723],"errorMessage":"can only call when creating"},{"pc":[290,305,325,340,360,375,395,410,430,445,465,484,506,530,554,576,600,624,639,661,679,703],"errorMessage":"can only call when not creating"},{"pc":[981,1204],"errorMessage":"check self.admin exists"},{"pc":[1796,1846,1971,1982,2062,2160,2207,2389,2511,2710,2976],"errorMessage":"check self.assets entry exists"},{"pc":[1106,1142,1185,1421,1545,1819,2026],"errorMessage":"check self.labels entry exists"},{"pc":[1286,1395,1604,1629,1733],"errorMessage":"check self.operators entry exists"},{"pc":[2288,2372,2657,2905],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4ZTFiYjk1ZmMgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQyCiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF90ZXh0KGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUtMzQ2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X3RleHQoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRUZXh0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ3CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3RleHQoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c190ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHQoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3RleHRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTYtMzU3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjUKICAgIC8vIGhhc19jbGF3YmFjaz1hcmM0LkJvb2woYXNzZXQuY2xhd2JhY2sgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1OS0zNjcKICAgIC8vIHJldHVybiBBc3NldFNtYWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGhhc19mcmVlemU9YXJjNC5Cb29sKGFzc2V0LmZyZWV6ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDEwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgcHVzaGludCAxMDUgLy8gMTA1CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfc21hbGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9zbWFsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFNtYWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcxCiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfc21hbGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfc21hbGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19zbWFsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMtMzc0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19zbWFsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc2CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3NtYWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19zbWFsbF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfc21hbGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAtMzgxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgzCiAgICAvLyByZXNlcnZlX2FjY3QgPSBBY2NvdW50KGFzc2V0LnJlc2VydmUuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4NS0zODcKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgLy8gaWYgcmVzZXJ2ZV9hY2N0LmlzX29wdGVkX2luKGFzc2V0KQogICAgLy8gZWxzZSBVSW50NjQoMCkKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGFzc2V0LmJhbGFuY2UocmVzZXJ2ZV9hY2N0KQogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTEKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MgogICAgLy8gdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5MwogICAgLy8gdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBtYW5hZ2VyPWFyYzQuQWRkcmVzcyhhc3NldC5tYW5hZ2VyKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEwCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk3CiAgICAvLyBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTgKICAgIC8vIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA4CiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAwCiAgICAvLyBtZXRhZGF0YV9oYXNoPWFyYzQuRHluYW1pY0J5dGVzKGFzc2V0Lm1ldGFkYXRhX2hhc2gpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk5CiAgICAvLyByZXNlcnZlX2JhbGFuY2U9YXJjNC5VSW50NjQocmVzZXJ2ZV9iYWxhbmNlKSwKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDUKICAgIGZyYW1lX2RpZyA0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4OS00MDIKICAgIC8vIHJldHVybiBBc3NldEZ1bGwoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgICAgbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICAvLyAgICAgZnJlZXplPWFyYzQuQWRkcmVzcyhhc3NldC5mcmVlemUpLAogICAgLy8gICAgIGNsYXdiYWNrPWFyYzQuQWRkcmVzcyhhc3NldC5jbGF3YmFjayksCiAgICAvLyAgICAgcmVzZXJ2ZT1hcmM0LkFkZHJlc3MoYXNzZXQucmVzZXJ2ZSksCiAgICAvLyAgICAgcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICAvLyAgICAgbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNTUgLy8gMTU1CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDliCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA5CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDgKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANgoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODcKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNC00MDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfZnVsbChzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldEZ1bGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfZnVsbChhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfZnVsbChzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfZnVsbF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X2Z1bGwKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2Z1bGxfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIK","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0E4buV/ARVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/9xBUSI+f+L/xZJvUUBQQBCiwO+RIsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQiwJJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/vooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"labels","type":"string[]"},{"name":"url","type":"string"}],"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro_labels","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_text","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string[],string)","struct":"AssetText"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_text","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_small","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_small","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_full","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_full","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1107,1546,1565,1990],"errorMessage":"Index access is out of bounds"},{"pc":[287,302,322,337,357,372,392,407,427,442,462,481,503,527,551,573,597,621,636,658,676,700],"errorMessage":"OnCompletion is not NoOp"},{"pc":[2856],"errorMessage":"account opted into asset"},{"pc":[2274,2282,2358,2366,2478,2486,2508,2635,2643,2651,2665,2671,2686,2840,2861,2871,2881,2891,2899,2918,2926,2934,2942,2947],"errorMessage":"asset exists"},{"pc":[723],"errorMessage":"can only call when creating"},{"pc":[290,305,325,340,360,375,395,410,430,445,465,484,506,530,554,576,600,624,639,661,679,703],"errorMessage":"can only call when not creating"},{"pc":[981,1204],"errorMessage":"check self.admin exists"},{"pc":[1796,1846,1971,1982,2062,2160,2207,2389,2503,2710,2976],"errorMessage":"check self.assets entry exists"},{"pc":[1106,1142,1185,1421,1545,1819,2026],"errorMessage":"check self.labels entry exists"},{"pc":[1286,1395,1604,1629,1733],"errorMessage":"check self.operators entry exists"},{"pc":[2288,2372,2657,2905],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0ET1PCXQRVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/8WSb1FAUEASosCvkSL/3EFRIj58YsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQTwVJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/tooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -136,15 +136,15 @@ export function AssetSmallFromTuple(abiTuple: [string, string, number, bigint, b export type AssetText = { name: string, unitName: string, - url: string, - labels: string[] + labels: string[], + url: string } /** * Converts the ABI tuple representation of a AssetText to the struct representation */ -export function AssetTextFromTuple(abiTuple: [string, string, string, string[]]) { +export function AssetTextFromTuple(abiTuple: [string, string, string[], string]) { return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetText, APP_SPEC.structs) as AssetText } @@ -223,7 +223,7 @@ export type AssetLabelingArgs = { 'get_assets_micro_labels(uint64[])void': { assets: bigint[] | number[] } - 'get_asset_text(uint64)(string,string,string,string[])': { + 'get_asset_text(uint64)(string,string,string[],string)': { asset: bigint | number } 'get_assets_text(uint64[])void': { @@ -262,7 +262,7 @@ export type AssetLabelingArgs = { 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] 'get_asset_micro_labels(uint64)(string,uint8,string[])': [asset: bigint | number] 'get_assets_micro_labels(uint64[])void': [assets: bigint[] | number[]] - 'get_asset_text(uint64)(string,string,string,string[])': [asset: bigint | number] + 'get_asset_text(uint64)(string,string,string[],string)': [asset: bigint | number] 'get_assets_text(uint64[])void': [assets: bigint[] | number[]] 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': [asset: bigint | number] 'get_assets_small(uint64[])void': [assets: bigint[] | number[]] @@ -291,7 +291,7 @@ export type AssetLabelingReturns = { 'get_assets_micro(uint64[])void': void 'get_asset_micro_labels(uint64)(string,uint8,string[])': AssetMicroLabels 'get_assets_micro_labels(uint64[])void': void - 'get_asset_text(uint64)(string,string,string,string[])': AssetText + 'get_asset_text(uint64)(string,string,string[],string)': AssetText 'get_assets_text(uint64[])void': void 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': AssetSmall 'get_assets_small(uint64[])void': void @@ -387,10 +387,10 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_assets_micro_labels(uint64[])void'] returns: AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] }> - & Record<'get_asset_text(uint64)(string,string,string,string[])' | 'get_asset_text', { - argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string,string[])'] - argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string,string[])'] - returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] + & Record<'get_asset_text(uint64)(string,string,string[],string)' | 'get_asset_text', { + argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string[],string)'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string[],string)'] + returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] }> & Record<'get_assets_text(uint64[])void' | 'get_assets_text', { argsObj: AssetLabelingArgs['obj']['get_assets_text(uint64[])void'] @@ -705,15 +705,15 @@ export abstract class AssetLabelingParamsFactory { } } /** - * Constructs a no op call for the get_asset_text(uint64)(string,string,string,string[]) ABI method + * Constructs a no op call for the get_asset_text(uint64)(string,string,string[],string) ABI method * * @param params Parameters for the call * @returns An `AppClientMethodCallParams` object for the call */ - static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { return { ...params, - method: 'get_asset_text(uint64)(string,string,string,string[])' as const, + method: 'get_asset_text(uint64)(string,string,string[],string)' as const, args: Array.isArray(params.args) ? params.args : [params.args.asset], } } @@ -1201,14 +1201,14 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call params */ - getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetText(params)) }, @@ -1467,14 +1467,14 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call transaction */ - getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetText(params)) }, @@ -1749,16 +1749,16 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call result */ - getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'])} + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'])} }, /** @@ -1956,16 +1956,16 @@ export class AssetLabelingClient { } /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call result */ - async getAssetText(params: CallParams) { + async getAssetText(params: CallParams) { const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) - return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] + return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] } /** @@ -2244,11 +2244,11 @@ export class AssetLabelingClient { return this }, /** - * Add a get_asset_text(uint64)(string,string,string,string[]) method call against the AssetLabeling contract + * Add a get_asset_text(uint64)(string,string,string[],string) method call against the AssetLabeling contract */ - getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetText(params))) - resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string,string[])', v)) + resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string[],string)', v)) return this }, /** @@ -2471,13 +2471,13 @@ export type AssetLabelingComposer = { getAssetsMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] | undefined]> /** - * Calls the get_asset_text(uint64)(string,string,string,string[]) ABI method. + * Calls the get_asset_text(uint64)(string,string,string[],string) ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ - getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] | undefined]> + getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] | undefined]> /** * Calls the get_assets_text(uint64[])void ABI method. diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py index a34d8a7..fd85205 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py @@ -28,8 +28,8 @@ class AssetMicroLabels(arc4.Struct): class AssetText(arc4.Struct): name: arc4.String unit_name: arc4.String - url: arc4.String labels: LabelList + url: arc4.String # Small view, what a hover card on an explorer may show From e8f6f1f1e84c6836fbe6e9ed6b8dd7c4af215ae7 Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Thu, 3 Apr 2025 11:20:14 +0300 Subject: [PATCH 14/15] package json --- projects/abel-sdk-v2/.gitignore | 1 + projects/abel-sdk-v2/package.json | 4 ++-- projects/abel-sdk-v2/src/index.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 projects/abel-sdk-v2/.gitignore diff --git a/projects/abel-sdk-v2/.gitignore b/projects/abel-sdk-v2/.gitignore new file mode 100644 index 0000000..d2a0cb3 --- /dev/null +++ b/projects/abel-sdk-v2/.gitignore @@ -0,0 +1 @@ +.npmrc diff --git a/projects/abel-sdk-v2/package.json b/projects/abel-sdk-v2/package.json index db97ca8..fc65cd8 100644 --- a/projects/abel-sdk-v2/package.json +++ b/projects/abel-sdk-v2/package.json @@ -1,6 +1,6 @@ { - "name": "abel-sdk-v2", - "version": "1.0.0", + "name": "abel-sdk", + "version": "0.0.0-a", "description": "", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index 7fe3606..bf9df36 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -372,7 +372,7 @@ export class AbelSDK { */ async batchCall(method: T, args: FirstArgument, methodMax: number): Promise> { const chunked = chunk(args, methodMax); - const res: ReturnType[] = await pMap(chunked, (arg) => method(arg), { concurrency: this.concurrency }); + const res = (await pMap(chunked, (arg) => method(arg), { concurrency: this.concurrency })); // @ts-ignore return mergeMapsArr(res); } From 1b724a41cc52f4893eb68fff6782c1f21b330e1d Mon Sep 17 00:00:00 2001 From: Tasos Bitsios Date: Thu, 3 Apr 2025 11:44:56 +0300 Subject: [PATCH 15/15] AssetText / AssetTextLabel split & type fixes --- .../artifacts/AssetLabeling.arc32.json | 67 +- projects/abel-sdk-v2/cli/.appid | 1 - projects/abel-sdk-v2/cli/create-assets.ts | 37 - projects/abel-sdk-v2/cli/create.ts | 98 - projects/abel-sdk-v2/cli/get-full.ts | 43 - projects/abel-sdk-v2/cli/get-micro-labels.ts | 44 - projects/abel-sdk-v2/cli/get-micro.ts | 43 - projects/abel-sdk-v2/cli/get-small.ts | 43 - projects/abel-sdk-v2/cli/get-text.ts | 43 - projects/abel-sdk-v2/cli/label-asset.ts | 38 - projects/abel-sdk-v2/cli/state.ts | 48 - projects/abel-sdk-v2/cli/unlabel-asset.ts | 38 - .../src/generated/abel-contract-client.ts | 432 +- projects/abel-sdk-v2/src/index.ts | 49 +- .../AssetLabeling.approval.puya.map | 5282 ++++++++++------- .../AssetLabeling.approval.teal | 996 ++-- .../asset_labeling/AssetLabeling.arc56.json | 283 +- .../asset_labeling/AssetLabelingClient.ts | 432 +- .../asset_labeling/contract.py | 47 +- .../asset_labeling/deploy-config.ts | 2 +- .../smart_contracts/asset_labeling/types.py | 9 +- .../tests/asset-labeling.spec.ts | 22 +- .../tests/{sdk.ts => helpers.ts} | 0 23 files changed, 4866 insertions(+), 3231 deletions(-) delete mode 100644 projects/abel-sdk-v2/cli/.appid delete mode 100644 projects/abel-sdk-v2/cli/create-assets.ts delete mode 100644 projects/abel-sdk-v2/cli/create.ts delete mode 100644 projects/abel-sdk-v2/cli/get-full.ts delete mode 100644 projects/abel-sdk-v2/cli/get-micro-labels.ts delete mode 100644 projects/abel-sdk-v2/cli/get-micro.ts delete mode 100644 projects/abel-sdk-v2/cli/get-small.ts delete mode 100644 projects/abel-sdk-v2/cli/get-text.ts delete mode 100644 projects/abel-sdk-v2/cli/label-asset.ts delete mode 100644 projects/abel-sdk-v2/cli/state.ts delete mode 100644 projects/abel-sdk-v2/cli/unlabel-asset.ts rename projects/asset_labeling-contracts/tests/{sdk.ts => helpers.ts} (100%) diff --git a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json index f441301..757d99a 100644 --- a/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json +++ b/projects/abel-sdk-v2/artifacts/AssetLabeling.arc32.json @@ -142,7 +142,7 @@ "no_op": "CALL" } }, - "get_asset_text(uint64)(string,string,string[],string)": { + "get_asset_text(uint64)(string,string,string,string[])": { "read_only": true, "call_config": { "no_op": "CALL" @@ -159,9 +159,40 @@ "unit_name", "string" ], + [ + "url", + "string" + ], [ "labels", "string[]" + ] + ] + } + } + }, + "get_assets_text(uint64[])void": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + }, + "get_asset_text_labels(uint64)(string,string,string)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetTextLabels", + "elements": [ + [ + "name", + "string" + ], + [ + "unit_name", + "string" ], [ "url", @@ -171,7 +202,7 @@ } } }, - "get_assets_text(uint64[])void": { + "get_assets_text_labels(uint64[])void": { "read_only": true, "call_config": { "no_op": "CALL" @@ -293,7 +324,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW4gPSBUeG4uc2VuZGVyCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI5CiAgICBwdXNoYnl0ZXNzIDB4OGYwZDdkOGUgMHg3YzFiMzJmNiAweDE3ZTY5MWFlIDB4MzNkMGZmZGMgMHg3MjU2MTZlNyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAweGE2N2YwM2MyIDB4YWFlZTBjNjEgMHhiNmMzOWY2OCAweDYzNWJlMzYyIDB4NzA5M2IxMGQgMHhlMWJiOTVmYyAweDU1NDBiODBhIDB4OGE0MTJmOTMgMHg2ZjE3Y2RkNSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfdGV4dF9sYWJlbHModWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dF9sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3NtYWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyx1aW50OCx1aW50NjQsYm9vbCxib29sLHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19zbWFsbCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfZnVsbCh1aW50NjQpKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ2NCx1aW50OCxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGJ5dGVbXSx1aW50NjQsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX2Z1bGwodWludDY0W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUgbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNyBtYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTggbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjAgbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMSBtYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMiBtYWluX2dldF9hc3NldF90ZXh0X2xhYmVsc19yb3V0ZUAyMyBtYWluX2dldF9hc3NldHNfdGV4dF9sYWJlbHNfcm91dGVAMjQgbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjUgbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjcgbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjgKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDQxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2Z1bGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfZnVsbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19zbWFsbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfc21hbGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dF9sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3RleHRfbGFiZWxzX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3RleHRfbGFiZWxzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMyBtYWluX2FmdGVyX2lmX2Vsc2VAMzMgbWFpbl91cGRhdGVAMzAgbWFpbl9kZWxldGVAMzEKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzCgptYWluX2RlbGV0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdXBkYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMyOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTIKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnVwZGF0ZSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZGVsZXRlKCkgLT4gdm9pZDoKZGVsZXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUtNzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAtODEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIHB1c2hieXRlcyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NS04OQogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDkgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTYKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTk5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMy0xMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA1CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE0CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gb3BlcmF0b3JfaW5kZXggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjItMTIzCiAgICAvLyBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCm9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDAtMTQxCiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTIKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU5LTE2MQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3NgogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzYKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc3CiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAtMTgxCiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOSAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2LTE5OQogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Ni0xOTkKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5LTIxMAogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTQKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQtMjM1CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0Mi0yNDMKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ0LTI0NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzktMjQwCiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTkKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2LTI3NwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgtMjgwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjEKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcwCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMtMjg0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODctMjg4CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MC0yOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk3CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk4CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAxCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF9taWNybyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE0CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEyLTMxNQogICAgLy8gcmV0dXJuIEFzc2V0TWljcm8oCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE3LTMxOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNybyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm8oYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNybyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMyCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMzCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM0CiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzEtMzM1CiAgICAvLyByZXR1cm4gQXNzZXRNaWNyb0xhYmVscygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA1IC8vIDUKICAgICsKICAgIHB1c2hieXRlcyAweDAwMDUKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3LTMzOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNyb19sYWJlbHMoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNyb0xhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm9fbGFiZWxzKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MS0zNDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfdGV4dChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldFRleHQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU0CiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEtMzU2CiAgICAvLyByZXR1cm4gQXNzZXRUZXh0KAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4LTM1OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjItMzYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dExhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzQKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcyLTM3NgogICAgLy8gcmV0dXJuIEFzc2V0VGV4dExhYmVscygKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgLy8gKQogICAgZGlnIDIKICAgIGxlbgogICAgcHVzaGludCA2IC8vIDYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc4LTM3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0X2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFRleHRMYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0X2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0X2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX3RleHRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dF9sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg5LTM5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk2CiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTkKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTItNDAwCiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMi00MDMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2LTQwNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEzLTQxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTgtNDIwCiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDE4CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIzCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDI0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjYKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjcKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjkKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMxCiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzQKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjItNDM1CiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIwCiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzctNDM4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MS00NDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -562,7 +593,7 @@ ], "readonly": true, "returns": { - "type": "(string,string,string[],string)" + "type": "(string,string,string,string[])" } }, { @@ -578,6 +609,32 @@ "type": "void" } }, + { + "name": "get_asset_text_labels", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "readonly": true, + "returns": { + "type": "(string,string,string)" + } + }, + { + "name": "get_assets_text_labels", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "readonly": true, + "returns": { + "type": "void" + } + }, { "name": "get_asset_small", "args": [ @@ -634,6 +691,8 @@ "networks": {} }, "bare_call_config": { + "update_application": "CALL", + "delete_application": "CALL", "no_op": "CREATE" } } \ No newline at end of file diff --git a/projects/abel-sdk-v2/cli/.appid b/projects/abel-sdk-v2/cli/.appid deleted file mode 100644 index e9ec79e..0000000 --- a/projects/abel-sdk-v2/cli/.appid +++ /dev/null @@ -1 +0,0 @@ -5117 \ No newline at end of file diff --git a/projects/abel-sdk-v2/cli/create-assets.ts b/projects/abel-sdk-v2/cli/create-assets.ts deleted file mode 100644 index e5544a5..0000000 --- a/projects/abel-sdk-v2/cli/create-assets.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; -import { TransactionComposer } from "@algorandfoundation/algokit-utils/types/composer"; - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const { "last-round": lr } = await algorand.client.algod.status().do(); -let { - block: { tc }, -} = await algorand.client.algod.block(lr).do(); - -function addAsset(composer: TransactionComposer, times) { - for (let i = 1; i <= times; i++) { - composer = composer.addAssetCreate({ - assetName: `AN1${tc + i}`, - unitName: `UN${tc + i}`, - url: `URL${tc + i}`, - total: 1234567890n, - decimals: 10, - sender: deployer.addr, - }); - } - tc += times; - return composer; -} - -const num = Math.ceil(parseInt(process.argv[2] ?? "256", 10) / 16); - -for(let i=0; i sdk.getOperatorLabels(o))); - const assetLabels = await sdk.getAssetsLabels(assets); - - console.dir({ labels: labelDescriptors, operators: [operators, operatorLabels], assetLabels }); -} - -await logAllState(); - -const existingLabels = await sdk.getAllLabels(); -if (!existingLabels.includes(LABEL_ID)) { - console.log("creating label"); - await sdk.addLabel(LABEL_ID, LABEL_NAME); -} - -console.log("getOperatorLabels"); -let operatorLabels = await sdk.getOperatorLabels(operator); - -if (!operatorLabels.includes(LABEL_ID)) { - console.log("adding operator to label"); - await sdk.addOperatorToLabel(operator, LABEL_ID); -} -operatorLabels = await sdk.getOperatorLabels(operator); -console.log({ operatorLabels }); - -console.log("get all operators", await sdk.getAllOperators()); - -if (!(await sdk.getAssetLabels(ASSET_ID)).includes(LABEL_ID)) { - console.log("add label to asset"); - await sdk.addLabelToAsset(ASSET_ID, LABEL_ID); -} - -const assetLabels = await sdk.getAssetLabels(ASSET_ID); -console.log({ assetLabels }); - -console.log("multi with nonexist") -console.log(await sdk.getAssetsLabels([3832n, ASSET_ID])) - - -await logAllState(); -// if (process.env.STOP) -// process.exit(1); -// -// -// console.log("removing label from asset"); -// await sdk.removeLabelFromAsset(ASSET_ID, LABEL_ID); -// -// console.log(await sdk.getLabelDescriptors(["pv"])); -// -// console.log("removing operator from label"); -// await sdk.removeOperatorFromLabel(operator, LABEL_ID); -// -// console.log("removing operator from label"); -// await sdk.removeLabel(LABEL_ID); -// diff --git a/projects/abel-sdk-v2/cli/get-full.ts b/projects/abel-sdk-v2/cli/get-full.ts deleted file mode 100644 index da51b1c..0000000 --- a/projects/abel-sdk-v2/cli/get-full.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -const start = BigInt(process.argv[2]) -const len = parseInt(process.argv[3], 10) -const concurrency = parseInt(process.argv[4] ?? "2", 10) - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); - -const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) -const startTs = Date.now(); -const assets = await sdk.getAssetsFull(aids); -const endTs = Date.now() -console.log(...assets.values()); -console.log(endTs - startTs, 'ms'); -console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/get-micro-labels.ts b/projects/abel-sdk-v2/cli/get-micro-labels.ts deleted file mode 100644 index 8559779..0000000 --- a/projects/abel-sdk-v2/cli/get-micro-labels.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -const start = BigInt(process.argv[2]) -const len = parseInt(process.argv[3], 10) -const concurrency = parseInt(process.argv[4] ?? "5", 10) - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); - -const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) -const startTs = Date.now(); -const assets = await sdk.getAssetsMicroLabels(aids); -const endTs = Date.now() - -console.log(...assets.values()); -console.log(endTs - startTs, 'ms'); -console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/get-micro.ts b/projects/abel-sdk-v2/cli/get-micro.ts deleted file mode 100644 index f87ceb6..0000000 --- a/projects/abel-sdk-v2/cli/get-micro.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -const start = BigInt(process.argv[2]) -const len = parseInt(process.argv[3], 10) -const concurrency = parseInt(process.argv[4] ?? "2", 10) - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); - -const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) -const startTs = Date.now(); -const assets = await sdk.getAssetsMicro(aids); -const endTs = Date.now() -console.log(...assets.values()); -console.log(endTs - startTs, 'ms'); -console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/get-small.ts b/projects/abel-sdk-v2/cli/get-small.ts deleted file mode 100644 index a793b25..0000000 --- a/projects/abel-sdk-v2/cli/get-small.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -const start = BigInt(process.argv[2]) -const len = parseInt(process.argv[3], 10) -const concurrency = parseInt(process.argv[4] ?? "2", 10) - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); - -const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) -const startTs = Date.now(); -const assets = await sdk.getAssetsSmall(aids); -const endTs = Date.now() -console.log(...assets.values()); -console.log(endTs - startTs, 'ms'); -console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/get-text.ts b/projects/abel-sdk-v2/cli/get-text.ts deleted file mode 100644 index e14cdeb..0000000 --- a/projects/abel-sdk-v2/cli/get-text.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -const start = BigInt(process.argv[2]) -const len = parseInt(process.argv[3], 10) -const concurrency = parseInt(process.argv[4] ?? "2", 10) - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, concurrency }); - -const aids = new Array(len).fill(0).map((_, i) => start+BigInt(i)) -const startTs = Date.now(); -const assets = await sdk.getAssetsText(aids); -const endTs = Date.now() -console.log(...assets.values()); -console.log(endTs - startTs, 'ms'); -console.log('map size:', assets.size); diff --git a/projects/abel-sdk-v2/cli/label-asset.ts b/projects/abel-sdk-v2/cli/label-asset.ts deleted file mode 100644 index 5b1d355..0000000 --- a/projects/abel-sdk-v2/cli/label-asset.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, }); - -const assetId = BigInt(process.argv[2] ?? "1002") -const label = process.argv[3] ?? "pv" - -const { txIds } = await sdk.addLabelToAsset(assetId, label); diff --git a/projects/abel-sdk-v2/cli/state.ts b/projects/abel-sdk-v2/cli/state.ts deleted file mode 100644 index 56c9e59..0000000 --- a/projects/abel-sdk-v2/cli/state.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, }); - -async function logAllState() { - const labels: string[] = await sdk.getAllLabels(); - const operators: string[] = await sdk.getAllOperators(); - const assets: bigint[] = await sdk.getAllAssetIDs(); - - const labelDescriptors = await sdk.getLabelDescriptors(labels); - const operatorLabels = await Promise.all(operators.map((o) => sdk.getOperatorLabels(o))); - const assetLabels = await sdk.getAssetsLabels(assets); - - console.dir({ labels: labelDescriptors, operators: [operators, operatorLabels], assetLabels }); -} - - -logAllState() diff --git a/projects/abel-sdk-v2/cli/unlabel-asset.ts b/projects/abel-sdk-v2/cli/unlabel-asset.ts deleted file mode 100644 index d506a21..0000000 --- a/projects/abel-sdk-v2/cli/unlabel-asset.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { writeFileSync } from "fs"; -import { AlgorandClient } from "@algorandfoundation/algokit-utils"; -import { AbelSDK, AssetLabelingClient, AssetLabelingFactory } from "../dist"; -import { Config } from "@algorandfoundation/algokit-utils"; - -Config.configure({ populateAppCallResources: false, debug: false, traceAll: false }); - -const algorand = AlgorandClient.fromEnvironment(); -const deployer = await algorand.account.fromEnvironment("DEPLOYER"); - -const factory = algorand.client.getTypedAppFactory(AssetLabelingFactory, { - defaultSender: deployer.addr, -}); - -const { appClient, result } = await factory.deploy({ - createParams: { - extraProgramPages: 3, - }, - onUpdate: "append", - onSchemaBreak: "append", -}); - -// If app was just created fund the app account -if (["create", "replace"].includes(result.operationPerformed)) { - await algorand.send.payment({ - amount: (0.1).algo(), - sender: deployer.addr, - receiver: appClient.appAddress, - }); -} - -const { appId } = appClient; -const sdk = new AbelSDK({ algorand, appId, writeAccount: deployer, }); - -const assetId = BigInt(process.argv[2] ?? "1002") -const label = process.argv[3] ?? "pv" - -const { txIds } = await sdk.removeLabelFromAsset(assetId, label); diff --git a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts index d6dc70b..73313ef 100644 --- a/projects/abel-sdk-v2/src/generated/abel-contract-client.ts +++ b/projects/abel-sdk-v2/src/generated/abel-contract-client.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"labels","type":"string[]"},{"name":"url","type":"string"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro_labels","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_text","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,string[],string)","struct":"AssetText"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_text","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_small","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_small","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_full","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_full","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":[]}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"arcs":[],"name":"AssetLabeling","structs":{"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"labels","type":"string[]"}],"AssetTextLabels":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}]},"methods":[{"name":"change_admin","args":[{"name":"new_admin","type":"account"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label","args":[{"name":"id","type":"string"},{"name":"name","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label","args":[{"name":"id","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_label","args":[{"name":"id","type":"string"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"log_labels","args":[{"name":"ids","type":"string[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_operator_to_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_operator_from_label","args":[{"name":"operator","type":"account"},{"name":"label","type":"string"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_operator_labels","args":[{"name":"operator","type":"account"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"add_label_to_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"remove_label_from_asset","args":[{"name":"label","type":"string"},{"name":"asset","type":"asset"}],"returns":{"type":"void"},"events":[],"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_labels","args":[{"name":"asset","type":"asset"}],"returns":{"type":"string[]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"string[][]"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_micro_labels","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_micro_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_text","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,string,string[])","struct":"AssetText"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_text","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_text_labels","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,string)","struct":"AssetTextLabels"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_text_labels","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_small","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_small","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_asset_full","args":[{"name":"asset","type":"uint64"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}},{"name":"get_assets_full","args":[{"name":"assets","type":"uint64[]"}],"returns":{"type":"void"},"events":[],"readonly":true,"actions":{"create":[],"call":["NoOp"]}}],"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"key":"YWRtaW4=","keyType":"AVMString","valueType":"AVMBytes"}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{}}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW4gPSBUeG4uc2VuZGVyCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI5CiAgICBwdXNoYnl0ZXNzIDB4OGYwZDdkOGUgMHg3YzFiMzJmNiAweDE3ZTY5MWFlIDB4MzNkMGZmZGMgMHg3MjU2MTZlNyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAweGE2N2YwM2MyIDB4YWFlZTBjNjEgMHhiNmMzOWY2OCAweDYzNWJlMzYyIDB4NzA5M2IxMGQgMHhlMWJiOTVmYyAweDU1NDBiODBhIDB4OGE0MTJmOTMgMHg2ZjE3Y2RkNSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfdGV4dF9sYWJlbHModWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dF9sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3NtYWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyx1aW50OCx1aW50NjQsYm9vbCxib29sLHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19zbWFsbCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfZnVsbCh1aW50NjQpKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ2NCx1aW50OCxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGJ5dGVbXSx1aW50NjQsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX2Z1bGwodWludDY0W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUgbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNyBtYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTggbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjAgbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMSBtYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMiBtYWluX2dldF9hc3NldF90ZXh0X2xhYmVsc19yb3V0ZUAyMyBtYWluX2dldF9hc3NldHNfdGV4dF9sYWJlbHNfcm91dGVAMjQgbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjUgbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjcgbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjgKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDQxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2Z1bGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfZnVsbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19zbWFsbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfc21hbGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dF9sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3RleHRfbGFiZWxzX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3RleHRfbGFiZWxzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMyBtYWluX2FmdGVyX2lmX2Vsc2VAMzMgbWFpbl91cGRhdGVAMzAgbWFpbl9kZWxldGVAMzEKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzCgptYWluX2RlbGV0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdXBkYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMyOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTIKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnVwZGF0ZSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZGVsZXRlKCkgLT4gdm9pZDoKZGVsZXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUtNzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAtODEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIHB1c2hieXRlcyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NS04OQogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDkgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTYKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTk5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMy0xMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA1CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE0CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gb3BlcmF0b3JfaW5kZXggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjItMTIzCiAgICAvLyBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCm9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDAtMTQxCiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTIKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU5LTE2MQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3NgogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzYKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc3CiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAtMTgxCiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOSAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2LTE5OQogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Ni0xOTkKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5LTIxMAogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTQKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQtMjM1CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0Mi0yNDMKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ0LTI0NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzktMjQwCiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTkKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2LTI3NwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgtMjgwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjEKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcwCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMtMjg0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODctMjg4CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MC0yOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk3CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk4CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAxCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF9taWNybyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE0CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEyLTMxNQogICAgLy8gcmV0dXJuIEFzc2V0TWljcm8oCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE3LTMxOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNybyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm8oYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNybyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMyCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMzCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM0CiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzEtMzM1CiAgICAvLyByZXR1cm4gQXNzZXRNaWNyb0xhYmVscygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA1IC8vIDUKICAgICsKICAgIHB1c2hieXRlcyAweDAwMDUKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3LTMzOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNyb19sYWJlbHMoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNyb0xhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm9fbGFiZWxzKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MS0zNDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfdGV4dChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldFRleHQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU0CiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEtMzU2CiAgICAvLyByZXR1cm4gQXNzZXRUZXh0KAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4LTM1OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjItMzYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dExhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzQKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcyLTM3NgogICAgLy8gcmV0dXJuIEFzc2V0VGV4dExhYmVscygKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgLy8gKQogICAgZGlnIDIKICAgIGxlbgogICAgcHVzaGludCA2IC8vIDYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc4LTM3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0X2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFRleHRMYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0X2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0X2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX3RleHRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dF9sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg5LTM5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk2CiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTkKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTItNDAwCiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMi00MDMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2LTQwNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEzLTQxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTgtNDIwCiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDE4CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIzCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDI0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjYKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjcKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjkKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMxCiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzQKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjItNDM1CiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIwCiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzctNDM4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MS00NDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"bareActions":{"create":["NoOp"],"call":["DeleteApplication","UpdateApplication"]}} as unknown as Arc56Contract /** * A state record containing binary data @@ -109,18 +109,32 @@ export function AssetMicroLabelsFromTuple(abiTuple: [string, number, string[]]) export type AssetText = { name: string, unitName: string, - labels: string[], - url: string + url: string, + labels: string[] } /** * Converts the ABI tuple representation of a AssetText to the struct representation */ -export function AssetTextFromTuple(abiTuple: [string, string, string[], string]) { +export function AssetTextFromTuple(abiTuple: [string, string, string, string[]]) { return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetText, APP_SPEC.structs) as AssetText } +export type AssetTextLabels = { + name: string, + unitName: string, + url: string +} + + +/** + * Converts the ABI tuple representation of a AssetTextLabels to the struct representation + */ +export function AssetTextLabelsFromTuple(abiTuple: [string, string, string]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetTextLabels, APP_SPEC.structs) as AssetTextLabels +} + export type AssetSmall = { name: string, unitName: string, @@ -223,12 +237,18 @@ export type AssetLabelingArgs = { 'get_assets_micro_labels(uint64[])void': { assets: bigint[] | number[] } - 'get_asset_text(uint64)(string,string,string[],string)': { + 'get_asset_text(uint64)(string,string,string,string[])': { asset: bigint | number } 'get_assets_text(uint64[])void': { assets: bigint[] | number[] } + 'get_asset_text_labels(uint64)(string,string,string)': { + asset: bigint | number + } + 'get_assets_text_labels(uint64[])void': { + assets: bigint[] | number[] + } 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': { asset: bigint | number } @@ -262,8 +282,10 @@ export type AssetLabelingArgs = { 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] 'get_asset_micro_labels(uint64)(string,uint8,string[])': [asset: bigint | number] 'get_assets_micro_labels(uint64[])void': [assets: bigint[] | number[]] - 'get_asset_text(uint64)(string,string,string[],string)': [asset: bigint | number] + 'get_asset_text(uint64)(string,string,string,string[])': [asset: bigint | number] 'get_assets_text(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_text_labels(uint64)(string,string,string)': [asset: bigint | number] + 'get_assets_text_labels(uint64[])void': [assets: bigint[] | number[]] 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': [asset: bigint | number] 'get_assets_small(uint64[])void': [assets: bigint[] | number[]] 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': [asset: bigint | number] @@ -291,8 +313,10 @@ export type AssetLabelingReturns = { 'get_assets_micro(uint64[])void': void 'get_asset_micro_labels(uint64)(string,uint8,string[])': AssetMicroLabels 'get_assets_micro_labels(uint64[])void': void - 'get_asset_text(uint64)(string,string,string[],string)': AssetText + 'get_asset_text(uint64)(string,string,string,string[])': AssetText 'get_assets_text(uint64[])void': void + 'get_asset_text_labels(uint64)(string,string,string)': AssetTextLabels + 'get_assets_text_labels(uint64[])void': void 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': AssetSmall 'get_assets_small(uint64[])void': void 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': AssetFull @@ -387,16 +411,26 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_assets_micro_labels(uint64[])void'] returns: AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] }> - & Record<'get_asset_text(uint64)(string,string,string[],string)' | 'get_asset_text', { - argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string[],string)'] - argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string[],string)'] - returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] + & Record<'get_asset_text(uint64)(string,string,string,string[])' | 'get_asset_text', { + argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string,string[])'] + returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] }> & Record<'get_assets_text(uint64[])void' | 'get_assets_text', { argsObj: AssetLabelingArgs['obj']['get_assets_text(uint64[])void'] argsTuple: AssetLabelingArgs['tuple']['get_assets_text(uint64[])void'] returns: AssetLabelingReturns['get_assets_text(uint64[])void'] }> + & Record<'get_asset_text_labels(uint64)(string,string,string)' | 'get_asset_text_labels', { + argsObj: AssetLabelingArgs['obj']['get_asset_text_labels(uint64)(string,string,string)'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_text_labels(uint64)(string,string,string)'] + returns: AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'] + }> + & Record<'get_assets_text_labels(uint64[])void' | 'get_assets_text_labels', { + argsObj: AssetLabelingArgs['obj']['get_assets_text_labels(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_text_labels(uint64[])void'] + returns: AssetLabelingReturns['get_assets_text_labels(uint64[])void'] + }> & Record<'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])' | 'get_asset_small', { argsObj: AssetLabelingArgs['obj']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] argsTuple: AssetLabelingArgs['tuple']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] @@ -468,6 +502,16 @@ export type GlobalKeysState = AssetLabelingTypes['state']['global']['keys'] */ export type AssetLabelingCreateCallParams = | Expand +/** + * Defines supported update method params for this smart contract + */ +export type AssetLabelingUpdateCallParams = + | Expand & {method?: never} +/** + * Defines supported delete method params for this smart contract + */ +export type AssetLabelingDeleteCallParams = + | Expand & {method?: never} /** * Defines arguments required for the deploy method. */ @@ -476,6 +520,14 @@ export type AssetLabelingDeployParams = Expand @@ -692,15 +744,15 @@ export abstract class AssetLabelingParamsFactory { } } /** - * Constructs a no op call for the get_asset_text(uint64)(string,string,string[],string) ABI method + * Constructs a no op call for the get_asset_text(uint64)(string,string,string,string[]) ABI method * * @param params Parameters for the call * @returns An `AppClientMethodCallParams` object for the call */ - static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { return { ...params, - method: 'get_asset_text(uint64)(string,string,string[],string)' as const, + method: 'get_asset_text(uint64)(string,string,string,string[])' as const, args: Array.isArray(params.args) ? params.args : [params.args.asset], } } @@ -717,6 +769,32 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.assets], } } + /** + * Constructs a no op call for the get_asset_text_labels(uint64)(string,string,string) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetTextLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_text_labels(uint64)(string,string,string)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_text_labels(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsTextLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_text_labels(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } /** * Constructs a no op call for the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method * @@ -866,6 +944,36 @@ export class AssetLabelingFactory { }, }, + /** + * Gets available deployUpdate methods + */ + deployUpdate: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a deployUpdate call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.deployUpdate(params) + }, + }, + + /** + * Gets available deployDelete methods + */ + deployDelete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a deployDelete call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.deployDelete(params) + }, + }, + } /** @@ -999,6 +1107,36 @@ export class AssetLabelingClient { * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. */ readonly params = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The update result + */ + bare: (params?: Expand) => { + return this.appClient.params.bare.update(params) + }, + }, + + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The delete result + */ + bare: (params?: Expand) => { + return this.appClient.params.bare.delete(params) + }, + }, + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * @@ -1188,14 +1326,14 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call params */ - getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetText(params)) }, @@ -1211,6 +1349,30 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsText(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -1265,6 +1427,36 @@ export class AssetLabelingClient { * Create transactions for the current app */ readonly createTransaction = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The update result + */ + bare: (params?: Expand) => { + return this.appClient.createTransaction.bare.update(params) + }, + }, + + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The delete result + */ + bare: (params?: Expand) => { + return this.appClient.createTransaction.bare.delete(params) + }, + }, + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * @@ -1454,14 +1646,14 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call transaction */ - getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetText(params)) }, @@ -1477,6 +1669,30 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsText(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -1531,6 +1747,36 @@ export class AssetLabelingClient { * Send calls to the current app */ readonly send = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The update result + */ + bare: (params?: Expand) => { + return this.appClient.send.bare.update(params) + }, + }, + + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The delete result + */ + bare: (params?: Expand) => { + return this.appClient.send.bare.delete(params) + }, + }, + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * @@ -1736,16 +1982,16 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call result */ - getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'])} + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'])} }, /** @@ -1761,6 +2007,32 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_text(uint64[])void'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetTextLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsTextLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_text_labels(uint64[])void'])} + }, + /** * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -1943,16 +2215,16 @@ export class AssetLabelingClient { } /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call result */ - async getAssetText(params: CallParams) { + async getAssetText(params: CallParams) { const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) - return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] + return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] } /** @@ -1968,6 +2240,32 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_assets_text(uint64[])void'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetTextLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsTextLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_text_labels(uint64[])void'] + } + /** * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -2179,11 +2477,11 @@ export class AssetLabelingClient { return this }, /** - * Add a get_asset_text(uint64)(string,string,string[],string) method call against the AssetLabeling contract + * Add a get_asset_text(uint64)(string,string,string,string[]) method call against the AssetLabeling contract */ - getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetText(params))) - resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string[],string)', v)) + resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string,string[])', v)) return this }, /** @@ -2194,6 +2492,22 @@ export class AssetLabelingClient { resultMappers.push(undefined) return this }, + /** + * Add a get_asset_text_labels(uint64)(string,string,string) method call against the AssetLabeling contract + */ + getAssetTextLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetTextLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_text_labels(uint64)(string,string,string)', v)) + return this + }, + /** + * Add a get_assets_text_labels(uint64[])void method call against the AssetLabeling contract + */ + getAssetsTextLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsTextLabels(params))) + resultMappers.push(undefined) + return this + }, /** * Add a get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) method call against the AssetLabeling contract */ @@ -2226,6 +2540,22 @@ export class AssetLabelingClient { resultMappers.push(undefined) return this }, + get update() { + return { + bare: (params?: AppClientBareCallParams & AppClientCompilationParams ) => { + promiseChain = promiseChain.then(async () => composer.addAppUpdate(await client.params.update.bare(params))) + return this + }, + } + }, + get delete() { + return { + bare: (params?: AppClientBareCallParams ) => { + promiseChain = promiseChain.then(() => composer.addAppDelete(client.params.delete.bare(params))) + return this + }, + } + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -2406,13 +2736,13 @@ export type AssetLabelingComposer = { getAssetsMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] | undefined]> /** - * Calls the get_asset_text(uint64)(string,string,string[],string) ABI method. + * Calls the get_asset_text(uint64)(string,string,string,string[]) ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ - getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] | undefined]> + getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] | undefined]> /** * Calls the get_assets_text(uint64[])void ABI method. @@ -2423,6 +2753,24 @@ export type AssetLabelingComposer = { */ getAssetsText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_text(uint64[])void'] | undefined]> + /** + * Calls the get_asset_text_labels(uint64)(string,string,string) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetTextLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'] | undefined]> + + /** + * Calls the get_assets_text_labels(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsTextLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_text_labels(uint64[])void'] | undefined]> + /** * Calls the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method. * @@ -2459,6 +2807,32 @@ export type AssetLabelingComposer = { */ getAssetsFull(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_full(uint64[])void'] | undefined]> + /** + * Gets available delete methods + */ + readonly delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + bare(params?: AppClientBareCallParams ): AssetLabelingComposer<[...TReturns, undefined]> + } + + /** + * Gets available update methods + */ + readonly update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + bare(params?: AppClientBareCallParams ): AssetLabelingComposer<[...TReturns, undefined]> + } + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/abel-sdk-v2/src/index.ts b/projects/abel-sdk-v2/src/index.ts index bf9df36..c19c4ab 100644 --- a/projects/abel-sdk-v2/src/index.ts +++ b/projects/abel-sdk-v2/src/index.ts @@ -1,17 +1,23 @@ -import { TransactionSignerAccount } from "@algorandfoundation/algokit-utils/types/account"; -import { decodeAddress, decodeUint64, encodeAddress, encodeUint64, makeEmptyTransactionSigner } from "algosdk"; import { AlgorandClient } from "@algorandfoundation/algokit-utils"; +import { TransactionSignerAccount } from "@algorandfoundation/algokit-utils/types/account"; import { BoxName } from "@algorandfoundation/algokit-utils/types/app"; +import { decodeAddress, decodeUint64, encodeAddress, encodeUint64, makeEmptyTransactionSigner } from "algosdk"; import pMap from "p-map"; import { + AssetFull, + AssetFullFromTuple, AssetLabelingClient, AssetLabelingFactory, AssetMicro, AssetMicroFromTuple, + AssetMicroLabels, AssetMicroLabelsFromTuple, + AssetSmall, AssetSmallFromTuple, + AssetText, AssetTextFromTuple, - AssetFullFromTuple, + AssetTextLabels, + AssetTextLabelsFromTuple, LabelDescriptorFromTuple as LabelDescriptorBoxValueFromTuple, } from "./generated/abel-contract-client.js"; import { AnyFn, FirstArgument, LabelDescriptor } from "./types.js"; @@ -49,7 +55,8 @@ export class AbelSDK { concurrency?: number; }) { // Client used for read queries. Sender can be any funded address. - // Default read is the A7N.. fee sink which is funded on all public ALGO networks incl. localnet + // Default read is the A7N.. fee sink which is funded on all public ALGO networks + // (localnet may be zero or at min balance though) this.readClient = algorand.client.getTypedAppClientById(AssetLabelingClient, { appId, defaultSender: readAccount, @@ -199,6 +206,7 @@ export class AbelSDK { async removeLabel(labelId: string) { this.requireWriteClient(); + const query = this.writeClient.send.removeLabel({ args: { id: labelId, @@ -210,6 +218,7 @@ export class AbelSDK { async addOperatorToLabel(operator: string, labelId: string) { this.requireWriteClient(); + const query = this.writeClient.send.addOperatorToLabel({ args: { operator, @@ -223,15 +232,18 @@ export class AbelSDK { async removeOperatorFromLabel(operator: string, labelId: string) { this.requireWriteClient(); + const query = await this.writeClient.send.removeOperatorFromLabel({ args: { operator, label: labelId }, boxReferences: [decodeAddress(operator).publicKey, labelId], }); + return wrapErrors(query); } async addLabelToAsset(assetId: bigint, labelId: string) { this.requireWriteClient(); + const query = this.writeClient.send.addLabelToAsset({ args: { asset: assetId, @@ -244,6 +256,7 @@ export class AbelSDK { async removeLabelFromAsset(assetId: bigint, labelId: string) { this.requireWriteClient(); + const query = this.writeClient.send.removeLabelFromAsset({ args: { asset: assetId, @@ -251,6 +264,7 @@ export class AbelSDK { }, boxReferences: [labelId, encodeUint64(assetId), decodeAddress(this.writeAccount.addr).publicKey], }); + return wrapErrors(query); } @@ -271,7 +285,7 @@ export class AbelSDK { return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); }; - getAssetsMicroLabels = async (assetIds: bigint[]): Promise> => { + getAssetsMicroLabels = async (assetIds: bigint[]): Promise> => { const METHOD_MAX = 64; if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsMicroLabels, assetIds, METHOD_MAX); @@ -286,8 +300,8 @@ export class AbelSDK { return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); }; - getAssetsText = async (assetIds: bigint[]): Promise> => { - const METHOD_MAX = 64; + getAssetsText = async (assetIds: bigint[]): Promise> => { + const METHOD_MAX = 128; if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsText, assetIds, METHOD_MAX); const { confirmations } = await wrapErrors( @@ -297,11 +311,26 @@ export class AbelSDK { .simulate(SIMULATE_PARAMS) ); - const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetMicroLabelsFromTuple, "get_asset_text"); + const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetTextFromTuple, "get_asset_text"); + return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); + }; + + getAssetsTextLabels = async (assetIds: bigint[]): Promise> => { + const METHOD_MAX = 64; + if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsTextLabels, assetIds, METHOD_MAX); + + const { confirmations } = await wrapErrors( + this.readClient + .newGroup() + .getAssetsTextLabels({ args: { assets: assetIds } }) + .simulate(SIMULATE_PARAMS) + ); + + const assetValues = this.parseLogsAs(confirmations[0]!.logs ?? [], AssetTextLabelsFromTuple, "get_asset_text_labels"); return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); }; - getAssetsSmall = async (assetIds: bigint[]): Promise> => { + getAssetsSmall = async (assetIds: bigint[]): Promise> => { const METHOD_MAX = 64; if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsSmall, assetIds, METHOD_MAX); @@ -316,7 +345,7 @@ export class AbelSDK { return new Map(assetValues.map((descriptorValue, idx) => [assetIds[idx], { id: assetIds[idx], ...descriptorValue }])); }; - getAssetsFull = async (assetIds: bigint[]): Promise> => { + getAssetsFull = async (assetIds: bigint[]): Promise> => { const METHOD_MAX = 42; if (assetIds.length > METHOD_MAX) return this.batchCall(this.getAssetsFull, assetIds, METHOD_MAX); diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map index 60f90d6..fc01a6e 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.puya.map @@ -3,7 +3,7 @@ "sources": [ "../../asset_labeling/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDQ;;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAqWK;;AAAA;AAAA;AAAA;;AAAA;AArWL;;;AAqWK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjWL;;;AAAA;AAiWK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAlUL;;;AAkUK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA9TL;;;AAAA;AA8TK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AApBA;;AAAA;AAAA;AAAA;;AAAA;AA1SL;;;AA0SK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAtSL;;;AAAA;AAsSK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AArRL;;;AAqRK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAjRL;;;AAAA;AAiRK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AAjQL;;;AAiQK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA7PL;;;AAAA;AA6PK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA3BA;;AAAA;AAAA;AAAA;;AAAA;AAlOL;;;AAkOK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AA3NL;;;AAAA;AAAA;;AA2NK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAzLL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAyLK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AA7JL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AA6JK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA7IL;;;AAAA;AAAA;;AA6IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAoGK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAxEL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAwEK;;;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAzCL;;;AAyCK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AARA;;AAAA;AAAA;AAAA;;AAAA;AA5BL;;;AAAA;;;AA4BK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAjBL;;;AAAA;;;AAAA;;;AAAA;;;AAiBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AAZL;;;AAAA;AAAA;;AAYK;;;AAAA;;AAZL;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALA;;;AAEW;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAP;AAaW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAzBR;;;AAyBkC;;AAxBjC;AACA;;AAyBR;;;AAEQ;;;AACA;;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AAnCR;;;AAmC+B;;AAlC9B;AACA;AAkCO;;AAAA;AAAmB;AAAnB;AApCR;;;AAoC8B;;AAnC7B;AACA;AAoCI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AA9CR;;;AA8C2B;AA7C1B;AACA;AA6CO;;AAAA;AAAmB;AAAnB;AA/CR;;;AA+C8B;;AA9C7B;AACA;AA8CO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAhDR;;;AAgDyC;;AA/CxC;AACA;AA+CA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AArDR;;;AAqD2B;AApD1B;AACA;AAoDO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAIZ;;;AAEW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAG0C;;AAA9B;;AAAA;;;AAAoD;;AAApD;AAAA;;;AACkC;;AAA9B;;AAAA;;;AACD;;AADC;AADJ;;;;AAxEL;;;AA2EK;;AA1EJ;AACA;;;;;;AA4ER;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AA1FR;;;AA0F8B;AAzF7B;AACA;AA0FG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;;AADH;AA/FT;;;AAiGS;;AAhGR;AACA;AAmGe;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAvHR;;;AAuH8B;AAtH7B;AACA;AAsHO;;AAAA;AAAA;;AAxHR;;;AAwHoC;AAvHnC;AACA;AAyHA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AA7HL;;;AAgIK;AA/HJ;AACA;AAkImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AAtIL;;;AAuIK;;AAtIJ;AACA;AAyII;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAxJD;AA0JH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AA9KR;;;AA8K8B;AA7K7B;AACA;AA8KA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;;AAA5C;AArLT;;;AAsLS;;AArLR;AACA;AAwLe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AA1MR;;;AA0M8B;AAzM7B;AACA;AA0MA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AAlNT;;AAAA;;;AAiOe;AAhOd;AACA;AAkOmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AAtOD;AAwOH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA;AAQR;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAFN;;;;AAAA;AAAA;AAAA;AAAA;AAAP;AAKR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAC2B;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAHJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAnRG;;;;AAyRX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAC6C;AAA7B;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AAE0B;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AADG;;AAAA;;AAAA;AAAN;;;AAHD;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAvSG;;;;AA8SX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACS;;AAAA;;AAAA;AAAZ;AACe;;AAAA;;AAAA;AAAgB;;AAAhB;AAAV;;;AAAA;AAAA;;AAAA;AACY;;AAAA;;AAAA;AAAkB;;AAAlB;AAAV;;;AAAA;AAAA;;AAAA;AACuB;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAPJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA5TG;;;;AAsUX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;;;;AAG+B;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAGhB;;AAAA;;AAAA;;AADH;;;AAAA;;AAAA;;AAAA;;AAAA;AAKW;;AAAA;;AAAA;AAAN;;;AAAA;;AACW;;AAAA;;AAAA;AAAN;;;AAAA;;AACA;;AAAA;;AAAA;AAAN;;;AAAA;;AACc;;AAAA;;AAAA;AAAZ;AAAA;;AACc;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AACY;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AACE;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AAEW;;AAAA;;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AADE;AAAA;;AAEoB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAZJ;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA1VG;;;;AAwVM;;;;AAiBjB;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDQ;;AAAa;;AAAb;AAFR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAkYK;;AAAA;AAAA;AAAA;;AAAA;AAlYL;;;AAkYK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA9XL;;;AAAA;AA8XK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AA/VL;;;AA+VK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA3VL;;;AAAA;AA2VK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AApBA;;AAAA;AAAA;AAAA;;AAAA;AAvUL;;;AAuUK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAnUL;;;AAAA;AAmUK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AAnTL;;;AAmTK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA/SL;;;AAAA;AA+SK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AA9RL;;;AA8RK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AA1RL;;;AAAA;AA0RK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AA1QL;;;AA0QK;;;AAAA;;AAJA;;AAAA;AAAA;AAAA;;AAAA;AAtQL;;;AAAA;AAsQK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA3BA;;AAAA;AAAA;AAAA;;AAAA;AA3OL;;;AA2OK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AApOL;;;AAAA;AAAA;;AAoOK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlCA;;AAAA;AAAA;AAAA;;AAAA;AAlML;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAkMK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAtKL;;;AAAA;;;AAAA;;;AAAA;AAAA;;AAsKK;;;AAAA;;AAhBA;;AAAA;AAAA;AAAA;;AAAA;AAtJL;;;AAAA;AAAA;;AAsJK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzCA;;AAAA;AAAA;AAAA;;AAAA;AA7GL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AA6GK;;;AAAA;;AA5BA;;AAAA;AAAA;AAAA;;AAAA;AAjFL;;;AAAA;AAAA;;AAAA;;;AAAA;;;AAiFK;;;AAAA;;AAjCA;;AAAA;AAAA;AAAA;;AAAA;AAhDL;;;AAgDK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AA3CL;;;AAAA;;;AA2CK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AApCL;;;AAAA;;;AAoCK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;;AAAA;AAzBL;;;AAAA;;;AAAA;;;AAAA;;;AAyBK;;;AAAA;;AALA;;AAAA;AAAA;AAAA;;AAAA;AApBL;;;AAAA;AAAA;;AAoBK;;;AAAA;;AApBL;;AAAA;;;;;;;;;;;;;;AAAA;;;AAYK;;AAAA;AAAA;;;AAAA;;AAJA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAbL;;;AAEW;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAP;AAaI;;;;AAIA;;;;AAIO;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAjCR;;;AAiCkC;;AAhCjC;AACA;;AAiCR;;;AAEQ;;;AACA;;AAAA;;AAAA;;AAER;;;AAEQ;;;AACO;;AAAA;AAAA;;AA3CR;;;AA2C+B;;AA1C9B;AACA;AA0CO;;AAAA;AAAmB;AAAnB;AA5CR;;;AA4C8B;;;;;;;;;;;;AA3C7B;AACA;AA4CI;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AADc;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAlB;;AAAA;;AAAA;;AAAA;AAAA;;AAMR;;;AAEQ;;;AACO;;AAAA;AAAA;;AAtDR;;;AAsD2B;AArD1B;AACA;AAqDO;;AAAA;AAAA;AAAA;;;AAA8B;;AAA9B;AAvDR;;;AAuDyC;;AAtDxC;AACA;AAsDA;;AAAA;;;AAER;;;AAEe;;AAAA;AAAA;;AA5DR;;;AA4D2B;AA3D1B;AACA;AA2DO;;AAAA;AAAA;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC4B;;;AAAZ;AAAA;AAAJ;;;;;;;;;AAMZ;;;AAEW;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AACY;AACJ;;AAAA;;;;AAER;;;AAEuD;;AAA/C;;AAAiB;;;AAAjB;AAEsB;;AAAlB;AAAA;;;AACI;;AAAkB;;AAAlB;AADJ;;;;AAlFL;;;AAoFK;;AAnFJ;AACA;;;;;;AAqFR;;;;;;AAEW;;AAAA;AAAA;;AAAA;;;AACQ;;AAAP;;AAAA;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AAAA;;;;;;;;;;AACD;;AAAP;;AAAA;AAER;;;AAEQ;;AAAA;;;AACO;;AAAA;AAAA;;AAnGR;;;AAmG8B;AAlG7B;AACA;AAmGG;;AAAA;AAAA;;AAAX;;;AAGgB;;AAAA;;AAAA;;;AACG;;AADH;AAxGT;;;AA0GS;;AAzGR;AACA;AA4Ge;;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AAPiD;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA3B;;AAAA;;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEQ;;AAAA;;;AAEO;;AAAA;AAAA;;AAhIR;;;AAgI8B;AA/H7B;AACA;AA+HO;;AAAA;AAAA;;AAjIR;;;AAiIoC;AAhInC;AACA;AAkIA;;AAAA;;AAAY;;;AAAZ;AAAA;;AAEiB;;AAAb;AAAA;;;AACI;;AACD;;AADC;AADJ;;;;AAtIL;;;AAyIK;AAxIJ;AACA;AA2ImB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAEf;;;AAAiC;;;;;;;;;;AAAjC;AAAA;;;AAAsC;;AAAA;;;AAA+B;;AAA/B;AAAtC;;;;AA/IL;;;AAgJK;;AA/IJ;AACA;AAkJI;;AAAA;AAAA;;AAAA;AAAwC;AAAxC;AAD6B;AAAjC;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AAEG;;AAAA;AAAA;AAAA;AAAA;AAAmC;AAAnC;AAAX;;;AACY;;AAAA;;;AAEY;AAAA;;AAIwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;;AACG;;AAAA;;;;;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAER;;AAAA;;AAAA;;AAAA;;AAAA;;;;;;;;;;AAEZ;;;AAEW;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAjKD;AAmKH;AAWR;;;;;;;AAEe;;AAAA;AAAA;;AAvLR;;;AAuL8B;AAtL7B;AACA;AAuLA;;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AAbW;;AAAA;AAAA;;AAAA;;;AACQ;;AAeyC;;AAA5C;AA9LT;;;AA+LS;;AA9LR;AACA;AAiMe;;AAAA;AAAA;AAAA;AACK;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAhB;AAAA;;;AACA;;AAAA;;AAAA;AAMe;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AA/BoC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA5C;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACe;;;AAAA;;AAAA;AAAf;;;;;AAagB;;;;;;;;;;;;AAXD;;AAWC;;;AAUmC;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAlB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAArB;;AAAA;AAAA;;AAAA;AAAA;;;;AASZ;;;;;;;;;AAEe;;AAAA;AAAA;;AAnNR;;;AAmN8B;AAlN7B;AACA;AAmNA;;AAAA;;;AAEQ;AAAR;;AACG;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAX;;;AACe;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAf;;;AACgB;;AAAA;;AACQ;AAAR;;AA3NT;;AAAA;;;AA0Oe;AAzOd;AACA;AA2OmB;;AAAA;AAAA;AAEf;AAAA;AAAA;AAAqC;AAArC;AAD0B;AAA9B;;AAGA;;AAAA;;AAAA;;AAAA;AAAA;;AApBgB;AAAR;;;;;AAEQ;AAAA;;AAGwB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAhD;AAAA;AAAA;;;;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAgB;AAAA;;AACG;;;AAAA;;AAAA;AAAnB;;;AACoB;;AAAA;;AAAA;AAAA;;;AAAA;;;;;;;;;;;AAEQ;AAAR;;;;;AAER;;AAAA;AAAA;;AAAA;;AAAA;;;;AAWZ;;;AAEW;;AAAA;AAAA;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAP;AAAA;AA/OD;AAiPH;AAAA;AAER;;;;AAIc;AACd;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;AAC0B;AACX;AAAA;AAAA;;AAAA;AAAA;;AAAf;;;AAC2B;;AAAA;AAAA;AAAX;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;;AACR;;AAAA;;AAAA;AAQR;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAFN;;;;AAAA;AAAA;AAAA;AAAA;AAAP;AAKR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;AAI4B;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAC2B;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAHJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA5RG;;;;AAkSX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAC6C;AAA7B;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACA;;AAAA;;AAAA;AAAN;;;AACgC;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAJJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAhTG;;;;AAuTX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACA;;AAAA;;AAAA;AAAN;;;AAHD;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAP;AAMR;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAC4C;AAA5B;;;AAAJ;;;;;;;;;AAIZ;;;AAIuB;;AAAA;;AAAA;AAAN;;;AACW;;AAAA;;AAAA;AAAN;;;AACU;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACS;;AAAA;;AAAA;AAAZ;AACe;;AAAA;;AAAA;AAAgB;;AAAhB;AAAV;;;AAAA;AAAA;;AAAA;AACY;;AAAA;;AAAA;AAAkB;;AAAlB;AAAV;;;AAAA;AAAA;;AAAA;AACuB;;AAAA;AAAA;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAPJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAzVG;;;;AAmWX;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACsC;AAAtB;;;AAAJ;;;;;;;;;AAIZ;;;;;;AAG+B;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAGhB;;AAAA;;AAAA;;AADH;;;AAAA;;AAAA;;AAAA;;AAAA;AAKW;;AAAA;;AAAA;AAAN;;;AAAA;;AACW;;AAAA;;AAAA;AAAN;;;AAAA;;AACA;;AAAA;;AAAA;AAAN;;;AAAA;;AACc;;AAAA;;AAAA;AAAZ;AAAA;;AACc;;AAAA;;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AACY;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AACE;;AAAA;;AAAA;AAAA;;AAAA;AACD;;AAAA;;AAAA;AAAA;;AAAA;AAEW;;AAAA;;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AADE;AAAA;;AAEoB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAA7B;;;AAAA;;AAAA;AAAA;AAZJ;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAvXG;;;;AAqXM;;;;AAiBjB;;;AAEe;;AAAA;;;AAAP;AAER;;;AAEA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;;AAAA;;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACqC;AAArB;;;AAAJ;;;;;;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -14,9 +14,9 @@ "op": "intcblock 1 0 2 8 4294967295 4294967296" }, "17": { - "op": "bytecblock 0x151f7c75 \"ERR:NOEXIST\" 0x0000 \"\" \"admin\" \"ERR:EXISTS\" 0x0002 \"ERR:UNAUTH\" \"ERR:LENGTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0001" + "op": "bytecblock 0x151f7c75 \"ERR:NOEXIST\" 0x0000 \"\" \"admin\" \"ERR:EXISTS\" 0x0002 \"ERR:UNAUTH\" 0x0000000000000000 \"ERR:NOEMPTY\" 0x0001" }, - "106": { + "95": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -25,11 +25,11 @@ "tmp%0#0" ] }, - "108": { + "97": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "111": { + "100": { "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"" @@ -38,7 +38,7 @@ "\"admin\"" ] }, - "113": { + "102": { "op": "txn Sender", "defined_out": [ "\"admin\"", @@ -49,11 +49,11 @@ "new_state_value%0#0" ] }, - "115": { + "104": { "op": "app_global_put", "stack_out": [] }, - "116": { + "105": { "block": "main_after_if_else@2", "stack_in": [], "op": "txn NumAppArgs", @@ -64,12 +64,12 @@ "tmp%0#2" ] }, - "118": { - "op": "bz main_bare_routing@27", + "107": { + "op": "bz main_bare_routing@29", "stack_out": [] }, - "121": { - "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0x4f53c25d 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\", method \"get_asset_micro(uint64)(string,uint8)\", method \"get_assets_micro(uint64[])void\", method \"get_asset_micro_labels(uint64)(string,uint8,string[])\", method \"get_assets_micro_labels(uint64[])void\", method \"get_asset_text(uint64)(string,string,string[],string)\", method \"get_assets_text(uint64[])void\", method \"get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])\", method \"get_assets_small(uint64[])void\", method \"get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])\", method \"get_assets_full(uint64[])void\"", + "110": { + "op": "pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0xe1bb95fc 0x5540b80a 0x8a412f93 0x6f17cdd5 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method \"change_admin(account)void\", method \"add_label(string,string)void\", method \"remove_label(string)void\", method \"get_label(string)(string,uint64,uint64)\", method \"log_labels(string[])void\", method \"add_operator_to_label(account,string)void\", method \"remove_operator_from_label(account,string)void\", method \"get_operator_labels(account)string[]\", method \"add_label_to_asset(string,asset)void\", method \"remove_label_from_asset(string,asset)void\", method \"get_asset_labels(asset)string[]\", method \"get_assets_labels(uint64[])string[][]\", method \"get_asset_micro(uint64)(string,uint8)\", method \"get_assets_micro(uint64[])void\", method \"get_asset_micro_labels(uint64)(string,uint8,string[])\", method \"get_assets_micro_labels(uint64[])void\", method \"get_asset_text(uint64)(string,string,string,string[])\", method \"get_assets_text(uint64[])void\", method \"get_asset_text_labels(uint64)(string,string,string)\", method \"get_assets_text_labels(uint64[])void\", method \"get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])\", method \"get_assets_small(uint64[])void\", method \"get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])\", method \"get_assets_full(uint64[])void\"", "defined_out": [ "Method(add_label(string,string)void)", "Method(add_label_to_asset(string,asset)void)", @@ -80,13 +80,15 @@ "Method(get_asset_micro(uint64)(string,uint8))", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", - "Method(get_asset_text(uint64)(string,string,string[],string))", + "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_asset_text_labels(uint64)(string,string,string))", "Method(get_assets_full(uint64[])void)", "Method(get_assets_labels(uint64[])string[][])", "Method(get_assets_micro(uint64[])void)", "Method(get_assets_micro_labels(uint64[])void)", "Method(get_assets_small(uint64[])void)", "Method(get_assets_text(uint64[])void)", + "Method(get_assets_text_labels(uint64[])void)", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", "Method(log_labels(string[])void)", @@ -111,15 +113,17 @@ "Method(get_assets_micro(uint64[])void)", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_assets_micro_labels(uint64[])void)", - "Method(get_asset_text(uint64)(string,string,string[],string))", + "Method(get_asset_text(uint64)(string,string,string,string[]))", "Method(get_assets_text(uint64[])void)", + "Method(get_asset_text_labels(uint64)(string,string,string))", + "Method(get_assets_text_labels(uint64[])void)", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", "Method(get_assets_small(uint64[])void)", "Method(get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]))", "Method(get_assets_full(uint64[])void)" ] }, - "233": { + "232": { "op": "txna ApplicationArgs 0", "defined_out": [ "Method(add_label(string,string)void)", @@ -131,13 +135,15 @@ "Method(get_asset_micro(uint64)(string,uint8))", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", - "Method(get_asset_text(uint64)(string,string,string[],string))", + "Method(get_asset_text(uint64)(string,string,string,string[]))", + "Method(get_asset_text_labels(uint64)(string,string,string))", "Method(get_assets_full(uint64[])void)", "Method(get_assets_labels(uint64[])string[][])", "Method(get_assets_micro(uint64[])void)", "Method(get_assets_micro_labels(uint64[])void)", "Method(get_assets_small(uint64[])void)", "Method(get_assets_text(uint64[])void)", + "Method(get_assets_text_labels(uint64[])void)", "Method(get_label(string)(string,uint64,uint64))", "Method(get_operator_labels(account)string[])", "Method(log_labels(string[])void)", @@ -163,8 +169,10 @@ "Method(get_assets_micro(uint64[])void)", "Method(get_asset_micro_labels(uint64)(string,uint8,string[]))", "Method(get_assets_micro_labels(uint64[])void)", - "Method(get_asset_text(uint64)(string,string,string[],string))", + "Method(get_asset_text(uint64)(string,string,string,string[]))", "Method(get_assets_text(uint64[])void)", + "Method(get_asset_text_labels(uint64)(string,string,string))", + "Method(get_assets_text_labels(uint64[])void)", "Method(get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]))", "Method(get_assets_small(uint64[])void)", "Method(get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[]))", @@ -172,12 +180,12 @@ "tmp%2#0" ] }, - "236": { - "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 main_get_asset_micro_labels_route@19 main_get_assets_micro_labels_route@20 main_get_asset_text_route@21 main_get_assets_text_route@22 main_get_asset_small_route@23 main_get_assets_small_route@24 main_get_asset_full_route@25 main_get_assets_full_route@26", + "235": { + "op": "match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 main_get_asset_micro_labels_route@19 main_get_assets_micro_labels_route@20 main_get_asset_text_route@21 main_get_assets_text_route@22 main_get_asset_text_labels_route@23 main_get_assets_text_labels_route@24 main_get_asset_small_route@25 main_get_assets_small_route@26 main_get_asset_full_route@27 main_get_assets_full_route@28", "stack_out": [] }, - "282": { - "block": "main_after_if_else@29", + "285": { + "block": "main_after_if_else@33", "stack_in": [], "op": "intc_1 // 0", "defined_out": [ @@ -187,12 +195,189 @@ "tmp%0#0" ] }, - "283": { + "286": { + "op": "return", + "stack_out": [] + }, + "287": { + "block": "main_get_assets_full_route@28", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%158#0" + ], + "stack_out": [ + "tmp%158#0" + ] + }, + "289": { + "op": "!", + "defined_out": [ + "tmp%159#0" + ], + "stack_out": [ + "tmp%159#0" + ] + }, + "290": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "291": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%160#0" + ], + "stack_out": [ + "tmp%160#0" + ] + }, + "293": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "294": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%162#0" + ], + "stack_out": [ + "tmp%162#0" + ] + }, + "297": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_full", + "op": "callsub get_assets_full", + "stack_out": [] + }, + "300": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "301": { + "op": "return", + "stack_out": [] + }, + "302": { + "block": "main_get_asset_full_route@27", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%151#0" + ], + "stack_out": [ + "tmp%151#0" + ] + }, + "304": { + "op": "!", + "defined_out": [ + "tmp%152#0" + ], + "stack_out": [ + "tmp%152#0" + ] + }, + "305": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "306": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%153#0" + ], + "stack_out": [ + "tmp%153#0" + ] + }, + "308": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "309": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "reinterpret_bytes[8]%5#0" + ], + "stack_out": [ + "reinterpret_bytes[8]%5#0" + ] + }, + "312": { + "op": "btoi", + "defined_out": [ + "tmp%155#0" + ], + "stack_out": [ + "tmp%155#0" + ] + }, + "313": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_full", + "op": "callsub get_asset_full", + "defined_out": [ + "tmp%156#0" + ], + "stack_out": [ + "tmp%156#0" + ] + }, + "316": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%156#0" + ], + "stack_out": [ + "tmp%156#0", + "0x151f7c75" + ] + }, + "317": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%156#0" + ] + }, + "318": { + "op": "concat", + "defined_out": [ + "tmp%157#0" + ], + "stack_out": [ + "tmp%157#0" + ] + }, + "319": { + "op": "log", + "stack_out": [] + }, + "320": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "321": { "op": "return", "stack_out": [] }, - "284": { - "block": "main_get_assets_full_route@26", + "322": { + "block": "main_get_assets_small_route@26", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ @@ -202,7 +387,7 @@ "tmp%146#0" ] }, - "286": { + "324": { "op": "!", "defined_out": [ "tmp%147#0" @@ -211,12 +396,12 @@ "tmp%147#0" ] }, - "287": { + "325": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "288": { + "326": { "op": "txn ApplicationID", "defined_out": [ "tmp%148#0" @@ -225,12 +410,12 @@ "tmp%148#0" ] }, - "290": { + "328": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "291": { + "329": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%150#0" @@ -239,12 +424,12 @@ "tmp%150#0" ] }, - "294": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_full", - "op": "callsub get_assets_full", + "332": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_small", + "op": "callsub get_assets_small", "stack_out": [] }, - "297": { + "335": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -253,12 +438,12 @@ "tmp%0#0" ] }, - "298": { + "336": { "op": "return", "stack_out": [] }, - "299": { - "block": "main_get_asset_full_route@25", + "337": { + "block": "main_get_asset_small_route@25", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ @@ -268,7 +453,7 @@ "tmp%139#0" ] }, - "301": { + "339": { "op": "!", "defined_out": [ "tmp%140#0" @@ -277,12 +462,12 @@ "tmp%140#0" ] }, - "302": { + "340": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "303": { + "341": { "op": "txn ApplicationID", "defined_out": [ "tmp%141#0" @@ -291,12 +476,12 @@ "tmp%141#0" ] }, - "305": { + "343": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "306": { + "344": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[8]%4#0" @@ -305,7 +490,7 @@ "reinterpret_bytes[8]%4#0" ] }, - "309": { + "347": { "op": "btoi", "defined_out": [ "tmp%143#0" @@ -314,9 +499,9 @@ "tmp%143#0" ] }, - "310": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_full", - "op": "callsub get_asset_full", + "348": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_small", + "op": "callsub get_asset_small", "defined_out": [ "tmp%144#0" ], @@ -324,7 +509,7 @@ "tmp%144#0" ] }, - "313": { + "351": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -335,14 +520,14 @@ "0x151f7c75" ] }, - "314": { + "352": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%144#0" ] }, - "315": { + "353": { "op": "concat", "defined_out": [ "tmp%145#0" @@ -351,11 +536,11 @@ "tmp%145#0" ] }, - "316": { + "354": { "op": "log", "stack_out": [] }, - "317": { + "355": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -364,12 +549,12 @@ "tmp%0#0" ] }, - "318": { + "356": { "op": "return", "stack_out": [] }, - "319": { - "block": "main_get_assets_small_route@24", + "357": { + "block": "main_get_assets_text_labels_route@24", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ @@ -379,7 +564,7 @@ "tmp%134#0" ] }, - "321": { + "359": { "op": "!", "defined_out": [ "tmp%135#0" @@ -388,12 +573,12 @@ "tmp%135#0" ] }, - "322": { + "360": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "323": { + "361": { "op": "txn ApplicationID", "defined_out": [ "tmp%136#0" @@ -402,12 +587,12 @@ "tmp%136#0" ] }, - "325": { + "363": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "326": { + "364": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%138#0" @@ -416,12 +601,12 @@ "tmp%138#0" ] }, - "329": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_small", - "op": "callsub get_assets_small", + "367": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text_labels", + "op": "callsub get_assets_text_labels", "stack_out": [] }, - "332": { + "370": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -430,12 +615,12 @@ "tmp%0#0" ] }, - "333": { + "371": { "op": "return", "stack_out": [] }, - "334": { - "block": "main_get_asset_small_route@23", + "372": { + "block": "main_get_asset_text_labels_route@23", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ @@ -445,7 +630,7 @@ "tmp%127#0" ] }, - "336": { + "374": { "op": "!", "defined_out": [ "tmp%128#0" @@ -454,12 +639,12 @@ "tmp%128#0" ] }, - "337": { + "375": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "338": { + "376": { "op": "txn ApplicationID", "defined_out": [ "tmp%129#0" @@ -468,12 +653,12 @@ "tmp%129#0" ] }, - "340": { + "378": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "341": { + "379": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[8]%3#0" @@ -482,7 +667,7 @@ "reinterpret_bytes[8]%3#0" ] }, - "344": { + "382": { "op": "btoi", "defined_out": [ "tmp%131#0" @@ -491,9 +676,9 @@ "tmp%131#0" ] }, - "345": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_small", - "op": "callsub get_asset_small", + "383": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text_labels", + "op": "callsub get_asset_text_labels", "defined_out": [ "tmp%132#0" ], @@ -501,7 +686,7 @@ "tmp%132#0" ] }, - "348": { + "386": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -512,14 +697,14 @@ "0x151f7c75" ] }, - "349": { + "387": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%132#0" ] }, - "350": { + "388": { "op": "concat", "defined_out": [ "tmp%133#0" @@ -528,11 +713,11 @@ "tmp%133#0" ] }, - "351": { + "389": { "op": "log", "stack_out": [] }, - "352": { + "390": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -541,11 +726,11 @@ "tmp%0#0" ] }, - "353": { + "391": { "op": "return", "stack_out": [] }, - "354": { + "392": { "block": "main_get_assets_text_route@22", "stack_in": [], "op": "txn OnCompletion", @@ -556,7 +741,7 @@ "tmp%122#0" ] }, - "356": { + "394": { "op": "!", "defined_out": [ "tmp%123#0" @@ -565,12 +750,12 @@ "tmp%123#0" ] }, - "357": { + "395": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "358": { + "396": { "op": "txn ApplicationID", "defined_out": [ "tmp%124#0" @@ -579,12 +764,12 @@ "tmp%124#0" ] }, - "360": { + "398": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "361": { + "399": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%126#0" @@ -593,12 +778,12 @@ "tmp%126#0" ] }, - "364": { + "402": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text", "op": "callsub get_assets_text", "stack_out": [] }, - "367": { + "405": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -607,11 +792,11 @@ "tmp%0#0" ] }, - "368": { + "406": { "op": "return", "stack_out": [] }, - "369": { + "407": { "block": "main_get_asset_text_route@21", "stack_in": [], "op": "txn OnCompletion", @@ -622,7 +807,7 @@ "tmp%115#0" ] }, - "371": { + "409": { "op": "!", "defined_out": [ "tmp%116#0" @@ -631,12 +816,12 @@ "tmp%116#0" ] }, - "372": { + "410": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "373": { + "411": { "op": "txn ApplicationID", "defined_out": [ "tmp%117#0" @@ -645,12 +830,12 @@ "tmp%117#0" ] }, - "375": { + "413": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "376": { + "414": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[8]%2#0" @@ -659,7 +844,7 @@ "reinterpret_bytes[8]%2#0" ] }, - "379": { + "417": { "op": "btoi", "defined_out": [ "tmp%119#0" @@ -668,7 +853,7 @@ "tmp%119#0" ] }, - "380": { + "418": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text", "op": "callsub get_asset_text", "defined_out": [ @@ -678,7 +863,7 @@ "tmp%120#0" ] }, - "383": { + "421": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -689,14 +874,14 @@ "0x151f7c75" ] }, - "384": { + "422": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%120#0" ] }, - "385": { + "423": { "op": "concat", "defined_out": [ "tmp%121#0" @@ -705,11 +890,11 @@ "tmp%121#0" ] }, - "386": { + "424": { "op": "log", "stack_out": [] }, - "387": { + "425": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -718,11 +903,11 @@ "tmp%0#0" ] }, - "388": { + "426": { "op": "return", "stack_out": [] }, - "389": { + "427": { "block": "main_get_assets_micro_labels_route@20", "stack_in": [], "op": "txn OnCompletion", @@ -733,7 +918,7 @@ "tmp%110#0" ] }, - "391": { + "429": { "op": "!", "defined_out": [ "tmp%111#0" @@ -742,12 +927,12 @@ "tmp%111#0" ] }, - "392": { + "430": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "393": { + "431": { "op": "txn ApplicationID", "defined_out": [ "tmp%112#0" @@ -756,12 +941,12 @@ "tmp%112#0" ] }, - "395": { + "433": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "396": { + "434": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%114#0" @@ -770,12 +955,12 @@ "tmp%114#0" ] }, - "399": { + "437": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro_labels", "op": "callsub get_assets_micro_labels", "stack_out": [] }, - "402": { + "440": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -784,11 +969,11 @@ "tmp%0#0" ] }, - "403": { + "441": { "op": "return", "stack_out": [] }, - "404": { + "442": { "block": "main_get_asset_micro_labels_route@19", "stack_in": [], "op": "txn OnCompletion", @@ -799,7 +984,7 @@ "tmp%103#0" ] }, - "406": { + "444": { "op": "!", "defined_out": [ "tmp%104#0" @@ -808,12 +993,12 @@ "tmp%104#0" ] }, - "407": { + "445": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "408": { + "446": { "op": "txn ApplicationID", "defined_out": [ "tmp%105#0" @@ -822,12 +1007,12 @@ "tmp%105#0" ] }, - "410": { + "448": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "411": { + "449": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[8]%1#0" @@ -836,7 +1021,7 @@ "reinterpret_bytes[8]%1#0" ] }, - "414": { + "452": { "op": "btoi", "defined_out": [ "tmp%107#0" @@ -845,7 +1030,7 @@ "tmp%107#0" ] }, - "415": { + "453": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro_labels", "op": "callsub get_asset_micro_labels", "defined_out": [ @@ -855,7 +1040,7 @@ "tmp%108#0" ] }, - "418": { + "456": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -866,14 +1051,14 @@ "0x151f7c75" ] }, - "419": { + "457": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%108#0" ] }, - "420": { + "458": { "op": "concat", "defined_out": [ "tmp%109#0" @@ -882,11 +1067,11 @@ "tmp%109#0" ] }, - "421": { + "459": { "op": "log", "stack_out": [] }, - "422": { + "460": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -895,11 +1080,11 @@ "tmp%0#0" ] }, - "423": { + "461": { "op": "return", "stack_out": [] }, - "424": { + "462": { "block": "main_get_assets_micro_route@18", "stack_in": [], "op": "txn OnCompletion", @@ -910,7 +1095,7 @@ "tmp%98#0" ] }, - "426": { + "464": { "op": "!", "defined_out": [ "tmp%99#0" @@ -919,12 +1104,12 @@ "tmp%99#0" ] }, - "427": { + "465": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "428": { + "466": { "op": "txn ApplicationID", "defined_out": [ "tmp%100#0" @@ -933,12 +1118,12 @@ "tmp%100#0" ] }, - "430": { + "468": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "431": { + "469": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%102#0" @@ -947,12 +1132,12 @@ "tmp%102#0" ] }, - "434": { + "472": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", "op": "callsub get_assets_micro", "stack_out": [] }, - "437": { + "475": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -961,11 +1146,11 @@ "tmp%0#0" ] }, - "438": { + "476": { "op": "return", "stack_out": [] }, - "439": { + "477": { "block": "main_get_asset_micro_route@17", "stack_in": [], "op": "txn OnCompletion", @@ -976,7 +1161,7 @@ "tmp%91#0" ] }, - "441": { + "479": { "op": "!", "defined_out": [ "tmp%92#0" @@ -985,12 +1170,12 @@ "tmp%92#0" ] }, - "442": { + "480": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "443": { + "481": { "op": "txn ApplicationID", "defined_out": [ "tmp%93#0" @@ -999,12 +1184,12 @@ "tmp%93#0" ] }, - "445": { + "483": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "446": { + "484": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[8]%0#0" @@ -1013,7 +1198,7 @@ "reinterpret_bytes[8]%0#0" ] }, - "449": { + "487": { "op": "btoi", "defined_out": [ "tmp%95#0" @@ -1022,7 +1207,7 @@ "tmp%95#0" ] }, - "450": { + "488": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", "op": "callsub get_asset_micro", "defined_out": [ @@ -1032,7 +1217,7 @@ "tmp%96#0" ] }, - "453": { + "491": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1043,14 +1228,14 @@ "0x151f7c75" ] }, - "454": { + "492": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%96#0" ] }, - "455": { + "493": { "op": "concat", "defined_out": [ "tmp%97#0" @@ -1059,11 +1244,11 @@ "tmp%97#0" ] }, - "456": { + "494": { "op": "log", "stack_out": [] }, - "457": { + "495": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1072,11 +1257,11 @@ "tmp%0#0" ] }, - "458": { + "496": { "op": "return", "stack_out": [] }, - "459": { + "497": { "block": "main_get_assets_labels_route@16", "stack_in": [], "op": "txn OnCompletion", @@ -1087,7 +1272,7 @@ "tmp%84#0" ] }, - "461": { + "499": { "op": "!", "defined_out": [ "tmp%85#0" @@ -1096,12 +1281,12 @@ "tmp%85#0" ] }, - "462": { + "500": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "463": { + "501": { "op": "txn ApplicationID", "defined_out": [ "tmp%86#0" @@ -1110,12 +1295,12 @@ "tmp%86#0" ] }, - "465": { + "503": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "466": { + "504": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%88#0" @@ -1124,7 +1309,7 @@ "tmp%88#0" ] }, - "469": { + "507": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", "op": "callsub get_assets_labels", "defined_out": [ @@ -1134,7 +1319,7 @@ "tmp%89#0" ] }, - "472": { + "510": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1145,14 +1330,14 @@ "0x151f7c75" ] }, - "473": { + "511": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%89#0" ] }, - "474": { + "512": { "op": "concat", "defined_out": [ "tmp%90#0" @@ -1161,11 +1346,11 @@ "tmp%90#0" ] }, - "475": { + "513": { "op": "log", "stack_out": [] }, - "476": { + "514": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1174,11 +1359,11 @@ "tmp%0#0" ] }, - "477": { + "515": { "op": "return", "stack_out": [] }, - "478": { + "516": { "block": "main_get_asset_labels_route@15", "stack_in": [], "op": "txn OnCompletion", @@ -1189,7 +1374,7 @@ "tmp%76#0" ] }, - "480": { + "518": { "op": "!", "defined_out": [ "tmp%77#0" @@ -1198,12 +1383,12 @@ "tmp%77#0" ] }, - "481": { + "519": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "482": { + "520": { "op": "txn ApplicationID", "defined_out": [ "tmp%78#0" @@ -1212,12 +1397,12 @@ "tmp%78#0" ] }, - "484": { + "522": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "485": { + "523": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%6#0" @@ -1226,7 +1411,7 @@ "reinterpret_bytes[1]%6#0" ] }, - "488": { + "526": { "op": "btoi", "defined_out": [ "tmp%80#0" @@ -1235,7 +1420,7 @@ "tmp%80#0" ] }, - "489": { + "527": { "op": "txnas Assets", "defined_out": [ "tmp%81#0" @@ -1244,7 +1429,7 @@ "tmp%81#0" ] }, - "491": { + "529": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", "op": "callsub get_asset_labels", "defined_out": [ @@ -1254,7 +1439,7 @@ "tmp%82#0" ] }, - "494": { + "532": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1265,14 +1450,14 @@ "0x151f7c75" ] }, - "495": { + "533": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%82#0" ] }, - "496": { + "534": { "op": "concat", "defined_out": [ "tmp%83#0" @@ -1281,11 +1466,11 @@ "tmp%83#0" ] }, - "497": { + "535": { "op": "log", "stack_out": [] }, - "498": { + "536": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1294,11 +1479,11 @@ "tmp%0#0" ] }, - "499": { + "537": { "op": "return", "stack_out": [] }, - "500": { + "538": { "block": "main_remove_label_from_asset_route@14", "stack_in": [], "op": "txn OnCompletion", @@ -1309,7 +1494,7 @@ "tmp%68#0" ] }, - "502": { + "540": { "op": "!", "defined_out": [ "tmp%69#0" @@ -1318,12 +1503,12 @@ "tmp%69#0" ] }, - "503": { + "541": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "504": { + "542": { "op": "txn ApplicationID", "defined_out": [ "tmp%70#0" @@ -1332,12 +1517,12 @@ "tmp%70#0" ] }, - "506": { + "544": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "507": { + "545": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%72#0" @@ -1346,7 +1531,7 @@ "tmp%72#0" ] }, - "510": { + "548": { "op": "extract 2 0", "defined_out": [ "tmp%73#0" @@ -1355,7 +1540,7 @@ "tmp%73#0" ] }, - "513": { + "551": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%5#0", @@ -1366,7 +1551,7 @@ "reinterpret_bytes[1]%5#0" ] }, - "516": { + "554": { "op": "btoi", "defined_out": [ "tmp%73#0", @@ -1377,7 +1562,7 @@ "tmp%74#0" ] }, - "517": { + "555": { "op": "txnas Assets", "defined_out": [ "tmp%73#0", @@ -1388,12 +1573,12 @@ "tmp%75#0" ] }, - "519": { + "557": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", "op": "callsub remove_label_from_asset", "stack_out": [] }, - "522": { + "560": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1402,11 +1587,11 @@ "tmp%0#0" ] }, - "523": { + "561": { "op": "return", "stack_out": [] }, - "524": { + "562": { "block": "main_add_label_to_asset_route@13", "stack_in": [], "op": "txn OnCompletion", @@ -1417,7 +1602,7 @@ "tmp%60#0" ] }, - "526": { + "564": { "op": "!", "defined_out": [ "tmp%61#0" @@ -1426,12 +1611,12 @@ "tmp%61#0" ] }, - "527": { + "565": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "528": { + "566": { "op": "txn ApplicationID", "defined_out": [ "tmp%62#0" @@ -1440,12 +1625,12 @@ "tmp%62#0" ] }, - "530": { + "568": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "531": { + "569": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%64#0" @@ -1454,7 +1639,7 @@ "tmp%64#0" ] }, - "534": { + "572": { "op": "extract 2 0", "defined_out": [ "tmp%65#0" @@ -1463,7 +1648,7 @@ "tmp%65#0" ] }, - "537": { + "575": { "op": "txna ApplicationArgs 2", "defined_out": [ "reinterpret_bytes[1]%4#0", @@ -1474,7 +1659,7 @@ "reinterpret_bytes[1]%4#0" ] }, - "540": { + "578": { "op": "btoi", "defined_out": [ "tmp%65#0", @@ -1485,7 +1670,7 @@ "tmp%66#0" ] }, - "541": { + "579": { "op": "txnas Assets", "defined_out": [ "tmp%65#0", @@ -1496,12 +1681,12 @@ "tmp%67#0" ] }, - "543": { + "581": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", "op": "callsub add_label_to_asset", "stack_out": [] }, - "546": { + "584": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1510,11 +1695,11 @@ "tmp%0#0" ] }, - "547": { + "585": { "op": "return", "stack_out": [] }, - "548": { + "586": { "block": "main_get_operator_labels_route@12", "stack_in": [], "op": "txn OnCompletion", @@ -1525,7 +1710,7 @@ "tmp%52#0" ] }, - "550": { + "588": { "op": "!", "defined_out": [ "tmp%53#0" @@ -1534,12 +1719,12 @@ "tmp%53#0" ] }, - "551": { + "589": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "552": { + "590": { "op": "txn ApplicationID", "defined_out": [ "tmp%54#0" @@ -1548,12 +1733,12 @@ "tmp%54#0" ] }, - "554": { + "592": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "555": { + "593": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%3#0" @@ -1562,7 +1747,7 @@ "reinterpret_bytes[1]%3#0" ] }, - "558": { + "596": { "op": "btoi", "defined_out": [ "tmp%56#0" @@ -1571,7 +1756,7 @@ "tmp%56#0" ] }, - "559": { + "597": { "op": "txnas Accounts", "defined_out": [ "tmp%57#0" @@ -1580,7 +1765,7 @@ "tmp%57#0" ] }, - "561": { + "599": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", "op": "callsub get_operator_labels", "defined_out": [ @@ -1590,7 +1775,7 @@ "tmp%58#0" ] }, - "564": { + "602": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1601,14 +1786,14 @@ "0x151f7c75" ] }, - "565": { + "603": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%58#0" ] }, - "566": { + "604": { "op": "concat", "defined_out": [ "tmp%59#0" @@ -1617,11 +1802,11 @@ "tmp%59#0" ] }, - "567": { + "605": { "op": "log", "stack_out": [] }, - "568": { + "606": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1630,11 +1815,11 @@ "tmp%0#0" ] }, - "569": { + "607": { "op": "return", "stack_out": [] }, - "570": { + "608": { "block": "main_remove_operator_from_label_route@11", "stack_in": [], "op": "txn OnCompletion", @@ -1645,7 +1830,7 @@ "tmp%44#0" ] }, - "572": { + "610": { "op": "!", "defined_out": [ "tmp%45#0" @@ -1654,12 +1839,12 @@ "tmp%45#0" ] }, - "573": { + "611": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "574": { + "612": { "op": "txn ApplicationID", "defined_out": [ "tmp%46#0" @@ -1668,12 +1853,12 @@ "tmp%46#0" ] }, - "576": { + "614": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "577": { + "615": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%2#0" @@ -1682,7 +1867,7 @@ "reinterpret_bytes[1]%2#0" ] }, - "580": { + "618": { "op": "btoi", "defined_out": [ "tmp%48#0" @@ -1691,7 +1876,7 @@ "tmp%48#0" ] }, - "581": { + "619": { "op": "txnas Accounts", "defined_out": [ "tmp%49#0" @@ -1700,7 +1885,7 @@ "tmp%49#0" ] }, - "583": { + "621": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%49#0", @@ -1711,7 +1896,7 @@ "tmp%50#0" ] }, - "586": { + "624": { "op": "extract 2 0", "defined_out": [ "tmp%49#0", @@ -1722,12 +1907,12 @@ "tmp%51#0" ] }, - "589": { + "627": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", "op": "callsub remove_operator_from_label", "stack_out": [] }, - "592": { + "630": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1736,11 +1921,11 @@ "tmp%0#0" ] }, - "593": { + "631": { "op": "return", "stack_out": [] }, - "594": { + "632": { "block": "main_add_operator_to_label_route@10", "stack_in": [], "op": "txn OnCompletion", @@ -1751,7 +1936,7 @@ "tmp%36#0" ] }, - "596": { + "634": { "op": "!", "defined_out": [ "tmp%37#0" @@ -1760,12 +1945,12 @@ "tmp%37#0" ] }, - "597": { + "635": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "598": { + "636": { "op": "txn ApplicationID", "defined_out": [ "tmp%38#0" @@ -1774,12 +1959,12 @@ "tmp%38#0" ] }, - "600": { + "638": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "601": { + "639": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%1#0" @@ -1788,7 +1973,7 @@ "reinterpret_bytes[1]%1#0" ] }, - "604": { + "642": { "op": "btoi", "defined_out": [ "tmp%40#0" @@ -1797,7 +1982,7 @@ "tmp%40#0" ] }, - "605": { + "643": { "op": "txnas Accounts", "defined_out": [ "tmp%41#0" @@ -1806,7 +1991,7 @@ "tmp%41#0" ] }, - "607": { + "645": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%41#0", @@ -1817,7 +2002,7 @@ "tmp%42#0" ] }, - "610": { + "648": { "op": "extract 2 0", "defined_out": [ "tmp%41#0", @@ -1828,12 +2013,12 @@ "tmp%43#0" ] }, - "613": { + "651": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", "op": "callsub add_operator_to_label", "stack_out": [] }, - "616": { + "654": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1842,11 +2027,11 @@ "tmp%0#0" ] }, - "617": { + "655": { "op": "return", "stack_out": [] }, - "618": { + "656": { "block": "main_log_labels_route@9", "stack_in": [], "op": "txn OnCompletion", @@ -1857,7 +2042,7 @@ "tmp%31#0" ] }, - "620": { + "658": { "op": "!", "defined_out": [ "tmp%32#0" @@ -1866,12 +2051,12 @@ "tmp%32#0" ] }, - "621": { + "659": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "622": { + "660": { "op": "txn ApplicationID", "defined_out": [ "tmp%33#0" @@ -1880,12 +2065,12 @@ "tmp%33#0" ] }, - "624": { + "662": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "625": { + "663": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%35#0" @@ -1894,12 +2079,12 @@ "tmp%35#0" ] }, - "628": { + "666": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", "op": "callsub log_labels", "stack_out": [] }, - "631": { + "669": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -1908,11 +2093,11 @@ "tmp%0#0" ] }, - "632": { + "670": { "op": "return", "stack_out": [] }, - "633": { + "671": { "block": "main_get_label_route@8", "stack_in": [], "op": "txn OnCompletion", @@ -1923,7 +2108,7 @@ "tmp%23#0" ] }, - "635": { + "673": { "op": "!", "defined_out": [ "tmp%24#0" @@ -1932,12 +2117,12 @@ "tmp%24#0" ] }, - "636": { + "674": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "637": { + "675": { "op": "txn ApplicationID", "defined_out": [ "tmp%25#0" @@ -1946,12 +2131,12 @@ "tmp%25#0" ] }, - "639": { + "677": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "640": { + "678": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%27#0" @@ -1960,7 +2145,7 @@ "tmp%27#0" ] }, - "643": { + "681": { "op": "extract 2 0", "defined_out": [ "tmp%28#0" @@ -1969,7 +2154,7 @@ "tmp%28#0" ] }, - "646": { + "684": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "op": "callsub get_label", "defined_out": [ @@ -1979,7 +2164,7 @@ "tmp%29#0" ] }, - "649": { + "687": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1990,14 +2175,14 @@ "0x151f7c75" ] }, - "650": { + "688": { "op": "swap", "stack_out": [ "0x151f7c75", "tmp%29#0" ] }, - "651": { + "689": { "op": "concat", "defined_out": [ "tmp%30#0" @@ -2006,11 +2191,11 @@ "tmp%30#0" ] }, - "652": { + "690": { "op": "log", "stack_out": [] }, - "653": { + "691": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -2019,11 +2204,11 @@ "tmp%0#0" ] }, - "654": { + "692": { "op": "return", "stack_out": [] }, - "655": { + "693": { "block": "main_remove_label_route@7", "stack_in": [], "op": "txn OnCompletion", @@ -2034,7 +2219,7 @@ "tmp%17#0" ] }, - "657": { + "695": { "op": "!", "defined_out": [ "tmp%18#0" @@ -2043,12 +2228,12 @@ "tmp%18#0" ] }, - "658": { + "696": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "659": { + "697": { "op": "txn ApplicationID", "defined_out": [ "tmp%19#0" @@ -2057,12 +2242,12 @@ "tmp%19#0" ] }, - "661": { + "699": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "662": { + "700": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%21#0" @@ -2071,7 +2256,7 @@ "tmp%21#0" ] }, - "665": { + "703": { "op": "extract 2 0", "defined_out": [ "tmp%22#0" @@ -2080,12 +2265,12 @@ "tmp%22#0" ] }, - "668": { + "706": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "op": "callsub remove_label", "stack_out": [] }, - "671": { + "709": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -2094,11 +2279,11 @@ "tmp%0#0" ] }, - "672": { + "710": { "op": "return", "stack_out": [] }, - "673": { + "711": { "block": "main_add_label_route@6", "stack_in": [], "op": "txn OnCompletion", @@ -2109,7 +2294,7 @@ "tmp%9#0" ] }, - "675": { + "713": { "op": "!", "defined_out": [ "tmp%10#0" @@ -2118,12 +2303,12 @@ "tmp%10#0" ] }, - "676": { + "714": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "677": { + "715": { "op": "txn ApplicationID", "defined_out": [ "tmp%11#0" @@ -2132,12 +2317,12 @@ "tmp%11#0" ] }, - "679": { + "717": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "680": { + "718": { "op": "txna ApplicationArgs 1", "defined_out": [ "tmp%13#0" @@ -2146,7 +2331,7 @@ "tmp%13#0" ] }, - "683": { + "721": { "op": "extract 2 0", "defined_out": [ "tmp%14#0" @@ -2155,7 +2340,7 @@ "tmp%14#0" ] }, - "686": { + "724": { "op": "txna ApplicationArgs 2", "defined_out": [ "tmp%14#0", @@ -2166,7 +2351,7 @@ "tmp%15#0" ] }, - "689": { + "727": { "op": "extract 2 0", "defined_out": [ "tmp%14#0", @@ -2177,12 +2362,12 @@ "tmp%16#0" ] }, - "692": { + "730": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", "op": "callsub add_label", "stack_out": [] }, - "695": { + "733": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -2191,11 +2376,11 @@ "tmp%0#0" ] }, - "696": { + "734": { "op": "return", "stack_out": [] }, - "697": { + "735": { "block": "main_change_admin_route@5", "stack_in": [], "op": "txn OnCompletion", @@ -2206,7 +2391,7 @@ "tmp%3#0" ] }, - "699": { + "737": { "op": "!", "defined_out": [ "tmp%4#0" @@ -2215,12 +2400,12 @@ "tmp%4#0" ] }, - "700": { + "738": { "error": "OnCompletion is not NoOp", "op": "assert // OnCompletion is not NoOp", "stack_out": [] }, - "701": { + "739": { "op": "txn ApplicationID", "defined_out": [ "tmp%5#0" @@ -2229,12 +2414,12 @@ "tmp%5#0" ] }, - "703": { + "741": { "error": "can only call when not creating", "op": "assert // can only call when not creating", "stack_out": [] }, - "704": { + "742": { "op": "txna ApplicationArgs 1", "defined_out": [ "reinterpret_bytes[1]%0#0" @@ -2243,7 +2428,7 @@ "reinterpret_bytes[1]%0#0" ] }, - "707": { + "745": { "op": "btoi", "defined_out": [ "tmp%7#0" @@ -2252,7 +2437,7 @@ "tmp%7#0" ] }, - "708": { + "746": { "op": "txnas Accounts", "defined_out": [ "tmp%8#0" @@ -2261,12 +2446,12 @@ "tmp%8#0" ] }, - "710": { + "748": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", "op": "callsub change_admin", "stack_out": [] }, - "713": { + "751": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -2275,49 +2460,120 @@ "tmp%0#0" ] }, - "714": { + "752": { "op": "return", "stack_out": [] }, - "715": { - "block": "main_bare_routing@27", + "753": { + "block": "main_bare_routing@29", "stack_in": [], "op": "txn OnCompletion", "defined_out": [ - "tmp%151#0" + "tmp%163#0" ], "stack_out": [ - "tmp%151#0" + "tmp%163#0" ] }, - "717": { - "op": "bnz main_after_if_else@29", + "755": { + "op": "switch main___algopy_default_create@32 main_after_if_else@33 main_after_if_else@33 main_after_if_else@33 main_update@30 main_delete@31", "stack_out": [] }, - "720": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%152#0" - ], - "stack_out": [ - "tmp%152#0" - ] + "769": { + "op": "b main_after_if_else@33" }, - "722": { - "op": "!", + "772": { + "block": "main_delete@31", + "stack_in": [], + "op": "txn ApplicationID", "defined_out": [ - "tmp%153#0" + "tmp%166#0" ], "stack_out": [ - "tmp%153#0" + "tmp%166#0" ] }, - "723": { + "774": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "775": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.delete", + "op": "callsub delete" + }, + "778": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "779": { + "op": "return", + "stack_out": [] + }, + "780": { + "block": "main_update@30", + "stack_in": [], + "op": "txn ApplicationID", + "defined_out": [ + "tmp%164#0" + ], + "stack_out": [ + "tmp%164#0" + ] + }, + "782": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "783": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.update", + "op": "callsub update" + }, + "786": { + "op": "intc_0 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "787": { + "op": "return", + "stack_out": [] + }, + "788": { + "block": "main___algopy_default_create@32", + "stack_in": [], + "op": "txn ApplicationID", + "defined_out": [ + "tmp%168#0" + ], + "stack_out": [ + "tmp%168#0" + ] + }, + "790": { + "op": "!", + "defined_out": [ + "tmp%169#0" + ], + "stack_out": [ + "tmp%169#0" + ] + }, + "791": { "error": "can only call when creating", "op": "assert // can only call when creating", "stack_out": [] }, - "724": { + "792": { "op": "intc_0 // 1", "defined_out": [ "tmp%0#0" @@ -2326,11 +2582,11 @@ "tmp%0#0" ] }, - "725": { + "793": { "op": "return", "stack_out": [] }, - "726": { + "794": { "subroutine": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "params": { "array#0": "bytes", @@ -2341,7 +2597,7 @@ "stack_in": [], "op": "proto 3 1" }, - "729": { + "797": { "op": "frame_dig -3", "defined_out": [ "array#0 (copy)" @@ -2350,7 +2606,7 @@ "array#0 (copy)" ] }, - "731": { + "799": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -2361,7 +2617,7 @@ "0" ] }, - "732": { + "800": { "op": "extract_uint16", "defined_out": [ "array_length#0" @@ -2370,7 +2626,7 @@ "array_length#0" ] }, - "733": { + "801": { "op": "dup", "defined_out": [ "array_length#0", @@ -2381,7 +2637,7 @@ "array_length#0 (copy)" ] }, - "734": { + "802": { "op": "frame_dig -1", "defined_out": [ "array_length#0", @@ -2394,7 +2650,7 @@ "new_items_count#0 (copy)" ] }, - "736": { + "804": { "op": "+", "defined_out": [ "array_length#0", @@ -2405,14 +2661,14 @@ "new_length#0" ] }, - "737": { + "805": { "op": "swap", "stack_out": [ "new_length#0", "array_length#0" ] }, - "738": { + "806": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -2425,7 +2681,7 @@ "2" ] }, - "739": { + "807": { "op": "*", "defined_out": [ "new_length#0", @@ -2436,7 +2692,7 @@ "tmp%0#0" ] }, - "740": { + "808": { "op": "intc_2 // 2", "stack_out": [ "new_length#0", @@ -2444,7 +2700,7 @@ "2" ] }, - "741": { + "809": { "op": "+", "defined_out": [ "header_end#0", @@ -2455,7 +2711,7 @@ "header_end#0" ] }, - "742": { + "810": { "op": "dig 1", "defined_out": [ "header_end#0", @@ -2468,7 +2724,7 @@ "new_length#0 (copy)" ] }, - "744": { + "812": { "op": "itob", "defined_out": [ "header_end#0", @@ -2481,7 +2737,7 @@ "tmp%1#0" ] }, - "745": { + "813": { "op": "extract 6 2", "defined_out": [ "header_end#0", @@ -2494,7 +2750,7 @@ "tmp%2#0" ] }, - "748": { + "816": { "op": "cover 2", "defined_out": [ "header_end#0", @@ -2507,7 +2763,7 @@ "header_end#0" ] }, - "750": { + "818": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -2516,7 +2772,7 @@ "array#0 (copy)" ] }, - "752": { + "820": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -2526,7 +2782,7 @@ "2" ] }, - "753": { + "821": { "op": "dig 2", "defined_out": [ "2", @@ -2545,7 +2801,7 @@ "header_end#0 (copy)" ] }, - "755": { + "823": { "op": "substring3", "defined_out": [ "header_end#0", @@ -2560,7 +2816,7 @@ "tmp%3#0" ] }, - "756": { + "824": { "op": "frame_dig -1", "stack_out": [ "tmp%2#0", @@ -2570,7 +2826,7 @@ "new_items_count#0 (copy)" ] }, - "758": { + "826": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -2581,7 +2837,7 @@ "2" ] }, - "759": { + "827": { "op": "*", "defined_out": [ "header_end#0", @@ -2598,7 +2854,7 @@ "tmp%4#0" ] }, - "760": { + "828": { "op": "bzero", "defined_out": [ "header_end#0", @@ -2615,7 +2871,7 @@ "tmp%5#0" ] }, - "761": { + "829": { "op": "concat", "defined_out": [ "header_end#0", @@ -2630,7 +2886,7 @@ "tmp%6#0" ] }, - "762": { + "830": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -2640,7 +2896,7 @@ "array#0 (copy)" ] }, - "764": { + "832": { "op": "len", "defined_out": [ "header_end#0", @@ -2657,7 +2913,7 @@ "tmp%7#0" ] }, - "765": { + "833": { "op": "frame_dig -3", "stack_out": [ "tmp%2#0", @@ -2668,7 +2924,7 @@ "array#0 (copy)" ] }, - "767": { + "835": { "op": "uncover 3", "stack_out": [ "tmp%2#0", @@ -2679,7 +2935,7 @@ "header_end#0" ] }, - "769": { + "837": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -2690,7 +2946,7 @@ "tmp%7#0" ] }, - "771": { + "839": { "op": "substring3", "defined_out": [ "new_length#0", @@ -2705,7 +2961,7 @@ "tmp%8#0" ] }, - "772": { + "840": { "op": "concat", "defined_out": [ "new_length#0", @@ -2718,7 +2974,7 @@ "tmp%9#0" ] }, - "773": { + "841": { "op": "frame_dig -2", "defined_out": [ "new_items_bytes#0 (copy)", @@ -2733,7 +2989,7 @@ "new_items_bytes#0 (copy)" ] }, - "775": { + "843": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -2746,7 +3002,7 @@ "array_head_and_tail#0" ] }, - "776": { + "844": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -2759,7 +3015,7 @@ "new_length#0" ] }, - "777": { + "845": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -2768,7 +3024,7 @@ "2" ] }, - "778": { + "846": { "op": "*", "defined_out": [ "array_head_and_tail#0", @@ -2781,7 +3037,7 @@ "tail_offset#0" ] }, - "779": { + "847": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -2795,7 +3051,7 @@ "tail_offset#0" ] }, - "780": { + "848": { "op": "intc_1 // 0", "defined_out": [ "array_head_and_tail#0", @@ -2811,7 +3067,7 @@ "head_offset#0" ] }, - "781": { + "849": { "op": "swap", "defined_out": [ "array_head_and_tail#0", @@ -2828,7 +3084,7 @@ "tail_offset#1" ] }, - "782": { + "850": { "block": "dynamic_array_concat_byte_length_head_for_header@2", "stack_in": [ "tmp%2#0", @@ -2850,7 +3106,7 @@ "head_offset#0" ] }, - "784": { + "852": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -2866,7 +3122,7 @@ "tail_offset#0" ] }, - "786": { + "854": { "op": "<", "defined_out": [ "continue_looping%0#0", @@ -2882,7 +3138,7 @@ "continue_looping%0#0" ] }, - "787": { + "855": { "op": "bz dynamic_array_concat_byte_length_head_after_for@5", "stack_out": [ "tmp%2#0", @@ -2892,7 +3148,7 @@ "tail_offset#1" ] }, - "790": { + "858": { "op": "frame_dig 4", "defined_out": [ "head_offset#0", @@ -2908,7 +3164,7 @@ "tail_offset#1" ] }, - "792": { + "860": { "op": "dup", "defined_out": [ "head_offset#0", @@ -2926,7 +3182,7 @@ "tail_offset#1 (copy)" ] }, - "793": { + "861": { "op": "itob", "defined_out": [ "head_offset#0", @@ -2944,7 +3200,7 @@ "tmp%5#0" ] }, - "794": { + "862": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -2962,7 +3218,7 @@ "tail_offset_bytes#0" ] }, - "797": { + "865": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -2982,7 +3238,7 @@ "array_head_and_tail#0" ] }, - "799": { + "867": { "op": "frame_dig 3", "stack_out": [ "tmp%2#0", @@ -2996,7 +3252,7 @@ "head_offset#0" ] }, - "801": { + "869": { "op": "dup", "defined_out": [ "array_head_and_tail#0", @@ -3019,7 +3275,7 @@ "head_offset#0 (copy)" ] }, - "802": { + "870": { "op": "cover 4", "stack_out": [ "tmp%2#0", @@ -3034,7 +3290,7 @@ "head_offset#0 (copy)" ] }, - "804": { + "872": { "op": "uncover 2", "stack_out": [ "tmp%2#0", @@ -3049,7 +3305,7 @@ "tail_offset_bytes#0" ] }, - "806": { + "874": { "op": "replace3", "stack_out": [ "tmp%2#0", @@ -3062,7 +3318,7 @@ "array_head_and_tail#0" ] }, - "807": { + "875": { "op": "dup", "stack_out": [ "tmp%2#0", @@ -3076,7 +3332,7 @@ "array_head_and_tail#0" ] }, - "808": { + "876": { "op": "frame_bury 1", "defined_out": [ "array_head_and_tail#0", @@ -3095,7 +3351,7 @@ "array_head_and_tail#0" ] }, - "810": { + "878": { "op": "dig 1", "stack_out": [ "tmp%2#0", @@ -3109,7 +3365,7 @@ "tail_offset#1 (copy)" ] }, - "812": { + "880": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail#0", @@ -3129,7 +3385,7 @@ "tmp%6#1" ] }, - "813": { + "881": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -3151,7 +3407,7 @@ "2" ] }, - "814": { + "882": { "op": "+", "defined_out": [ "array_head_and_tail#0", @@ -3171,7 +3427,7 @@ "tmp%7#0" ] }, - "815": { + "883": { "op": "+", "stack_out": [ "tmp%2#0", @@ -3183,7 +3439,7 @@ "tail_offset#1" ] }, - "816": { + "884": { "op": "frame_bury 4", "defined_out": [ "array_head_and_tail#0", @@ -3200,7 +3456,7 @@ "head_offset#0" ] }, - "818": { + "886": { "op": "intc_2 // 2", "stack_out": [ "tmp%2#0", @@ -3212,7 +3468,7 @@ "2" ] }, - "819": { + "887": { "op": "+", "stack_out": [ "tmp%2#0", @@ -3223,7 +3479,7 @@ "head_offset#0" ] }, - "820": { + "888": { "op": "frame_bury 3", "stack_out": [ "tmp%2#0", @@ -3233,10 +3489,10 @@ "tail_offset#1" ] }, - "822": { + "890": { "op": "b dynamic_array_concat_byte_length_head_for_header@2" }, - "825": { + "893": { "block": "dynamic_array_concat_byte_length_head_after_for@5", "stack_in": [ "tmp%2#0", @@ -3258,7 +3514,7 @@ "tmp%2#0" ] }, - "827": { + "895": { "op": "frame_dig 1", "defined_out": [ "array_head_and_tail#0", @@ -3274,7 +3530,7 @@ "array_head_and_tail#0" ] }, - "829": { + "897": { "op": "concat", "defined_out": [ "array_head_and_tail#0", @@ -3290,14 +3546,14 @@ "tmp%12#0" ] }, - "830": { + "898": { "op": "frame_bury 0" }, - "832": { + "900": { "retsub": true, "op": "retsub" }, - "833": { + "901": { "subroutine": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", "params": { "array_items_count#0": "uint64", @@ -3309,19 +3565,19 @@ "stack_in": [], "op": "proto 4 1" }, - "836": { + "904": { "op": "bytec_3 // \"\"", "stack_out": [ "item_offset_adjustment#2" ] }, - "837": { + "905": { "op": "dup" }, - "838": { + "906": { "op": "frame_dig -2" }, - "840": { + "908": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -3335,7 +3591,7 @@ "2" ] }, - "841": { + "909": { "op": "*", "defined_out": [ "item_offset_adjustment#0", @@ -3347,7 +3603,7 @@ "item_offset_adjustment#0" ] }, - "842": { + "910": { "op": "frame_dig -4", "defined_out": [ "array_items_count#0 (copy)", @@ -3361,7 +3617,7 @@ "array_items_count#0 (copy)" ] }, - "844": { + "912": { "op": "intc_2 // 2", "stack_out": [ "item_offset_adjustment#2", @@ -3371,7 +3627,7 @@ "2" ] }, - "845": { + "913": { "op": "*", "defined_out": [ "item_offset_adjustment#0", @@ -3385,7 +3641,7 @@ "tmp%0#0" ] }, - "846": { + "914": { "op": "intc_1 // 0", "defined_out": [ "head_offset#0", @@ -3401,7 +3657,7 @@ "head_offset#0" ] }, - "847": { + "915": { "block": "dynamic_array_concat_dynamic_element_for_header@1", "stack_in": [ "item_offset_adjustment#2", @@ -3423,7 +3679,7 @@ "head_offset#0" ] }, - "849": { + "917": { "op": "frame_dig 3", "defined_out": [ "head_offset#0", @@ -3439,7 +3695,7 @@ "tmp%0#0" ] }, - "851": { + "919": { "op": "<", "defined_out": [ "continue_looping%0#0", @@ -3455,7 +3711,7 @@ "continue_looping%0#0" ] }, - "852": { + "920": { "op": "bz dynamic_array_concat_dynamic_element_after_for@4", "stack_out": [ "item_offset_adjustment#2", @@ -3465,7 +3721,7 @@ "head_offset#0" ] }, - "855": { + "923": { "op": "frame_dig -3", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -3481,7 +3737,7 @@ "array_head_and_tail#0 (copy)" ] }, - "857": { + "925": { "op": "frame_dig 4", "stack_out": [ "item_offset_adjustment#2", @@ -3493,7 +3749,7 @@ "head_offset#0" ] }, - "859": { + "927": { "op": "dup", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -3512,7 +3768,7 @@ "head_offset#0 (copy)" ] }, - "860": { + "928": { "op": "cover 2", "stack_out": [ "item_offset_adjustment#2", @@ -3525,7 +3781,7 @@ "head_offset#0 (copy)" ] }, - "862": { + "930": { "op": "extract_uint16", "defined_out": [ "head_offset#0", @@ -3542,7 +3798,7 @@ "item_offset#0" ] }, - "863": { + "931": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -3561,7 +3817,7 @@ "item_offset_adjustment#0" ] }, - "865": { + "933": { "op": "+", "defined_out": [ "head_offset#0", @@ -3579,7 +3835,7 @@ "tmp%1#0" ] }, - "866": { + "934": { "op": "itob", "defined_out": [ "head_offset#0", @@ -3597,7 +3853,7 @@ "tmp%2#0" ] }, - "867": { + "935": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -3615,7 +3871,7 @@ "tmp%3#0" ] }, - "870": { + "938": { "op": "frame_dig 1", "defined_out": [ "head_offset#0", @@ -3635,7 +3891,7 @@ "new_head#0" ] }, - "872": { + "940": { "op": "swap", "stack_out": [ "item_offset_adjustment#2", @@ -3648,7 +3904,7 @@ "tmp%3#0" ] }, - "873": { + "941": { "op": "concat", "stack_out": [ "item_offset_adjustment#2", @@ -3660,7 +3916,7 @@ "new_head#0" ] }, - "874": { + "942": { "op": "frame_bury 1", "defined_out": [ "head_offset#0", @@ -3677,7 +3933,7 @@ "head_offset#0" ] }, - "876": { + "944": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -3696,7 +3952,7 @@ "2" ] }, - "877": { + "945": { "op": "+", "stack_out": [ "item_offset_adjustment#2", @@ -3707,7 +3963,7 @@ "head_offset#0" ] }, - "878": { + "946": { "op": "frame_bury 4", "defined_out": [ "head_offset#0", @@ -3723,10 +3979,10 @@ "head_offset#0" ] }, - "880": { + "948": { "op": "b dynamic_array_concat_dynamic_element_for_header@1" }, - "883": { + "951": { "block": "dynamic_array_concat_dynamic_element_after_for@4", "stack_in": [ "item_offset_adjustment#2", @@ -3748,7 +4004,7 @@ "array_head_and_tail#0 (copy)" ] }, - "885": { + "953": { "op": "len", "defined_out": [ "item_offset_adjustment#2" @@ -3762,7 +4018,7 @@ "item_offset_adjustment#2" ] }, - "886": { + "954": { "op": "frame_bury 0", "defined_out": [ "item_offset_adjustment#2" @@ -3775,7 +4031,7 @@ "head_offset#0" ] }, - "888": { + "956": { "op": "intc_1 // 0", "defined_out": [ "head_offset#0", @@ -3790,7 +4046,7 @@ "head_offset#0" ] }, - "889": { + "957": { "op": "frame_bury 4", "defined_out": [ "head_offset#0", @@ -3804,7 +4060,7 @@ "head_offset#0" ] }, - "891": { + "959": { "block": "dynamic_array_concat_dynamic_element_for_header@5", "stack_in": [ "item_offset_adjustment#2", @@ -3826,7 +4082,7 @@ "head_offset#0" ] }, - "893": { + "961": { "op": "frame_dig 2", "defined_out": [ "head_offset#0", @@ -3842,7 +4098,7 @@ "item_offset_adjustment#0" ] }, - "895": { + "963": { "op": "<", "defined_out": [ "continue_looping%1#0", @@ -3858,7 +4114,7 @@ "continue_looping%1#0" ] }, - "896": { + "964": { "op": "bz dynamic_array_concat_dynamic_element_after_for@8", "stack_out": [ "item_offset_adjustment#2", @@ -3868,7 +4124,7 @@ "head_offset#0" ] }, - "899": { + "967": { "op": "frame_dig -1", "defined_out": [ "head_offset#0", @@ -3884,7 +4140,7 @@ "new_head_and_tail#0 (copy)" ] }, - "901": { + "969": { "op": "frame_dig 4", "stack_out": [ "item_offset_adjustment#2", @@ -3896,7 +4152,7 @@ "head_offset#0" ] }, - "903": { + "971": { "op": "dup", "defined_out": [ "head_offset#0", @@ -3915,7 +4171,7 @@ "head_offset#0 (copy)" ] }, - "904": { + "972": { "op": "cover 2", "stack_out": [ "item_offset_adjustment#2", @@ -3928,7 +4184,7 @@ "head_offset#0 (copy)" ] }, - "906": { + "974": { "op": "extract_uint16", "defined_out": [ "head_offset#0", @@ -3945,7 +4201,7 @@ "item_offset#0" ] }, - "907": { + "975": { "op": "frame_dig 0", "defined_out": [ "head_offset#0", @@ -3964,7 +4220,7 @@ "item_offset_adjustment#2" ] }, - "909": { + "977": { "op": "+", "defined_out": [ "head_offset#0", @@ -3982,7 +4238,7 @@ "tmp%5#0" ] }, - "910": { + "978": { "op": "itob", "defined_out": [ "head_offset#0", @@ -4000,7 +4256,7 @@ "tmp%6#0" ] }, - "911": { + "979": { "op": "extract 6 2", "defined_out": [ "head_offset#0", @@ -4018,7 +4274,7 @@ "tmp%7#0" ] }, - "914": { + "982": { "op": "frame_dig 1", "defined_out": [ "head_offset#0", @@ -4038,7 +4294,7 @@ "new_head#0" ] }, - "916": { + "984": { "op": "swap", "stack_out": [ "item_offset_adjustment#2", @@ -4051,7 +4307,7 @@ "tmp%7#0" ] }, - "917": { + "985": { "op": "concat", "stack_out": [ "item_offset_adjustment#2", @@ -4063,7 +4319,7 @@ "new_head#0" ] }, - "918": { + "986": { "op": "frame_bury 1", "defined_out": [ "head_offset#0", @@ -4080,7 +4336,7 @@ "head_offset#0" ] }, - "920": { + "988": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -4099,7 +4355,7 @@ "2" ] }, - "921": { + "989": { "op": "+", "stack_out": [ "item_offset_adjustment#2", @@ -4110,7 +4366,7 @@ "head_offset#0" ] }, - "922": { + "990": { "op": "frame_bury 4", "defined_out": [ "head_offset#0", @@ -4126,10 +4382,10 @@ "head_offset#0" ] }, - "924": { + "992": { "op": "b dynamic_array_concat_dynamic_element_for_header@5" }, - "927": { + "995": { "block": "dynamic_array_concat_dynamic_element_after_for@8", "stack_in": [ "item_offset_adjustment#2", @@ -4151,7 +4407,7 @@ "array_items_count#0 (copy)" ] }, - "929": { + "997": { "op": "frame_dig -2", "defined_out": [ "array_items_count#0 (copy)", @@ -4167,7 +4423,7 @@ "new_items_count#0 (copy)" ] }, - "931": { + "999": { "op": "+", "defined_out": [ "tmp%8#0" @@ -4181,7 +4437,7 @@ "tmp%8#0" ] }, - "932": { + "1000": { "op": "itob", "defined_out": [ "tmp%9#0" @@ -4195,7 +4451,7 @@ "tmp%9#0" ] }, - "933": { + "1001": { "op": "extract 6 2", "defined_out": [ "tmp%10#0" @@ -4209,7 +4465,7 @@ "tmp%10#0" ] }, - "936": { + "1004": { "op": "frame_dig 1", "defined_out": [ "new_head#0", @@ -4225,7 +4481,7 @@ "new_head#0" ] }, - "938": { + "1006": { "op": "concat", "defined_out": [ "new_head#0", @@ -4240,7 +4496,7 @@ "tmp%11#0" ] }, - "939": { + "1007": { "op": "frame_dig -3", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -4257,7 +4513,7 @@ "array_head_and_tail#0 (copy)" ] }, - "941": { + "1009": { "op": "frame_dig 3", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -4276,7 +4532,7 @@ "tmp%0#0" ] }, - "943": { + "1011": { "op": "frame_dig 0", "defined_out": [ "array_head_and_tail#0 (copy)", @@ -4297,7 +4553,7 @@ "item_offset_adjustment#2" ] }, - "945": { + "1013": { "op": "substring3", "defined_out": [ "item_offset_adjustment#2", @@ -4316,7 +4572,7 @@ "tmp%14#0" ] }, - "946": { + "1014": { "op": "concat", "defined_out": [ "item_offset_adjustment#2", @@ -4333,7 +4589,7 @@ "tmp%15#0" ] }, - "947": { + "1015": { "op": "frame_dig -1", "defined_out": [ "item_offset_adjustment#2", @@ -4352,7 +4608,7 @@ "new_head_and_tail#0 (copy)" ] }, - "949": { + "1017": { "op": "len", "defined_out": [ "item_offset_adjustment#2", @@ -4371,7 +4627,7 @@ "tmp%17#0" ] }, - "950": { + "1018": { "op": "frame_dig -1", "stack_out": [ "item_offset_adjustment#2", @@ -4384,7 +4640,7 @@ "new_head_and_tail#0 (copy)" ] }, - "952": { + "1020": { "op": "frame_dig 2", "defined_out": [ "item_offset_adjustment#0", @@ -4407,7 +4663,7 @@ "item_offset_adjustment#0" ] }, - "954": { + "1022": { "op": "uncover 2", "stack_out": [ "item_offset_adjustment#2", @@ -4421,7 +4677,7 @@ "tmp%17#0" ] }, - "956": { + "1024": { "op": "substring3", "defined_out": [ "item_offset_adjustment#0", @@ -4441,7 +4697,7 @@ "tmp%18#0" ] }, - "957": { + "1025": { "op": "concat", "defined_out": [ "item_offset_adjustment#0", @@ -4459,14 +4715,14 @@ "tmp%19#0" ] }, - "958": { + "1026": { "op": "frame_bury 0" }, - "960": { + "1028": { "retsub": true, "op": "retsub" }, - "961": { + "1029": { "subroutine": "smart_contracts.asset_labeling.contract.b2str", "params": { "b#0": "bytes" @@ -4475,7 +4731,7 @@ "stack_in": [], "op": "proto 1 1" }, - "964": { + "1032": { "op": "frame_dig -1", "defined_out": [ "b#0 (copy)" @@ -4484,7 +4740,7 @@ "b#0 (copy)" ] }, - "966": { + "1034": { "op": "len", "defined_out": [ "length%0#0" @@ -4493,7 +4749,7 @@ "length%0#0" ] }, - "967": { + "1035": { "op": "itob", "defined_out": [ "as_bytes%0#0" @@ -4502,7 +4758,7 @@ "as_bytes%0#0" ] }, - "968": { + "1036": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0" @@ -4511,14 +4767,14 @@ "length_uint16%0#0" ] }, - "971": { + "1039": { "op": "frame_dig -1", "stack_out": [ "length_uint16%0#0", "b#0 (copy)" ] }, - "973": { + "1041": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -4527,24 +4783,48 @@ "encoded_value%0#0" ] }, - "974": { + "1042": { "retsub": true, "op": "retsub" }, - "975": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "1043": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.update", "params": {}, - "block": "admin_only", + "block": "update", "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "tmp%0#0" - ], + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" + }, + "1046": { + "retsub": true, + "op": "retsub" + }, + "1047": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.delete", + "params": {}, + "block": "delete", + "stack_in": [], + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "op": "callsub admin_only" + }, + "1050": { + "retsub": true, + "op": "retsub" + }, + "1051": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", + "params": {}, + "block": "admin_only", + "stack_in": [], + "op": "txn Sender", + "defined_out": [ + "tmp%0#0" + ], "stack_out": [ "tmp%0#0" ] }, - "977": { + "1053": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -4555,7 +4835,7 @@ "0" ] }, - "978": { + "1054": { "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"", @@ -4568,7 +4848,7 @@ "\"admin\"" ] }, - "980": { + "1056": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -4581,7 +4861,7 @@ "maybe_exists%0#0" ] }, - "981": { + "1057": { "error": "check self.admin exists", "op": "assert // check self.admin exists", "stack_out": [ @@ -4589,7 +4869,7 @@ "maybe_value%0#0" ] }, - "982": { + "1058": { "op": "==", "defined_out": [ "cond#0" @@ -4598,11 +4878,11 @@ "cond#0" ] }, - "983": { + "1059": { "op": "bnz admin_only_after_if_else@3", "stack_out": [] }, - "986": { + "1062": { "op": "bytec 7 // \"ERR:UNAUTH\"", "defined_out": [ "\"ERR:UNAUTH\"" @@ -4611,20 +4891,20 @@ "\"ERR:UNAUTH\"" ] }, - "988": { + "1064": { "op": "log", "stack_out": [] }, - "989": { + "1065": { "op": "err" }, - "990": { + "1066": { "block": "admin_only_after_if_else@3", "stack_in": [], "retsub": true, "op": "retsub" }, - "991": { + "1067": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.change_admin", "params": { "new_admin#0": "bytes" @@ -4633,11 +4913,11 @@ "stack_in": [], "op": "proto 1 0" }, - "994": { + "1070": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "997": { + "1073": { "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"" @@ -4646,7 +4926,7 @@ "\"admin\"" ] }, - "999": { + "1075": { "op": "frame_dig -1", "defined_out": [ "\"admin\"", @@ -4657,15 +4937,15 @@ "new_admin#0 (copy)" ] }, - "1001": { + "1077": { "op": "app_global_put", "stack_out": [] }, - "1002": { + "1078": { "retsub": true, "op": "retsub" }, - "1003": { + "1079": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label", "params": { "id#0": "bytes", @@ -4675,11 +4955,11 @@ "stack_in": [], "op": "proto 2 0" }, - "1006": { + "1082": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "1009": { + "1085": { "op": "frame_dig -2", "defined_out": [ "id#0 (copy)" @@ -4688,7 +4968,7 @@ "id#0 (copy)" ] }, - "1011": { + "1087": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -4699,17 +4979,17 @@ "maybe_exists%0#0" ] }, - "1012": { + "1088": { "op": "bury 1", "stack_out": [ "maybe_exists%0#0" ] }, - "1014": { + "1090": { "op": "bz add_label_after_if_else@3", "stack_out": [] }, - "1017": { + "1093": { "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -4718,14 +4998,14 @@ "\"ERR:EXISTS\"" ] }, - "1019": { + "1095": { "op": "log", "stack_out": [] }, - "1020": { + "1096": { "op": "err" }, - "1021": { + "1097": { "block": "add_label_after_if_else@3", "stack_in": [], "op": "frame_dig -2", @@ -4736,7 +5016,7 @@ "id#0 (copy)" ] }, - "1023": { + "1099": { "op": "len", "defined_out": [ "tmp%2#0" @@ -4745,7 +5025,7 @@ "tmp%2#0" ] }, - "1024": { + "1100": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -4756,7 +5036,7 @@ "2" ] }, - "1025": { + "1101": { "op": "==", "defined_out": [ "cond#1" @@ -4765,12 +5045,12 @@ "cond#1" ] }, - "1026": { + "1102": { "op": "bnz add_label_after_if_else@7", "stack_out": [] }, - "1029": { - "op": "bytec 8 // \"ERR:LENGTH\"", + "1105": { + "op": "pushbytes \"ERR:LENGTH\"", "defined_out": [ "\"ERR:LENGTH\"" ], @@ -4778,14 +5058,14 @@ "\"ERR:LENGTH\"" ] }, - "1031": { + "1117": { "op": "log", "stack_out": [] }, - "1032": { + "1118": { "op": "err" }, - "1033": { + "1119": { "block": "add_label_after_if_else@7", "stack_in": [], "op": "frame_dig -1", @@ -4796,7 +5076,7 @@ "name#0 (copy)" ] }, - "1035": { + "1121": { "op": "len", "defined_out": [ "length%0#0" @@ -4805,7 +5085,7 @@ "length%0#0" ] }, - "1036": { + "1122": { "op": "itob", "defined_out": [ "as_bytes%0#0" @@ -4814,7 +5094,7 @@ "as_bytes%0#0" ] }, - "1037": { + "1123": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0" @@ -4823,14 +5103,14 @@ "length_uint16%0#0" ] }, - "1040": { + "1126": { "op": "frame_dig -1", "stack_out": [ "length_uint16%0#0", "name#0 (copy)" ] }, - "1042": { + "1128": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -4839,7 +5119,7 @@ "encoded_value%0#0" ] }, - "1043": { + "1129": { "op": "pushbytes 0x001200000000000000000000000000000000", "defined_out": [ "0x001200000000000000000000000000000000", @@ -4850,14 +5130,14 @@ "0x001200000000000000000000000000000000" ] }, - "1063": { + "1149": { "op": "swap", "stack_out": [ "0x001200000000000000000000000000000000", "encoded_value%0#0" ] }, - "1064": { + "1150": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%4#0" @@ -4866,7 +5146,7 @@ "encoded_tuple_buffer%4#0" ] }, - "1065": { + "1151": { "op": "frame_dig -2", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -4877,7 +5157,7 @@ "id#0 (copy)" ] }, - "1067": { + "1153": { "op": "box_del", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -4888,35 +5168,35 @@ "{box_del}" ] }, - "1068": { + "1154": { "op": "pop", "stack_out": [ "encoded_tuple_buffer%4#0" ] }, - "1069": { + "1155": { "op": "frame_dig -2", "stack_out": [ "encoded_tuple_buffer%4#0", "id#0 (copy)" ] }, - "1071": { + "1157": { "op": "swap", "stack_out": [ "id#0 (copy)", "encoded_tuple_buffer%4#0" ] }, - "1072": { + "1158": { "op": "box_put", "stack_out": [] }, - "1073": { + "1159": { "retsub": true, "op": "retsub" }, - "1074": { + "1160": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label", "params": { "id#0": "bytes" @@ -4925,11 +5205,11 @@ "stack_in": [], "op": "proto 1 0" }, - "1077": { + "1163": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_only", "op": "callsub admin_only" }, - "1080": { + "1166": { "op": "frame_dig -1", "defined_out": [ "id#0 (copy)" @@ -4938,7 +5218,7 @@ "id#0 (copy)" ] }, - "1082": { + "1168": { "op": "box_len", "defined_out": [ "cond#0", @@ -4949,17 +5229,17 @@ "cond#0" ] }, - "1083": { + "1169": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "1085": { + "1171": { "op": "bnz remove_label_after_if_else@3", "stack_out": [] }, - "1088": { + "1174": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -4968,14 +5248,14 @@ "\"ERR:NOEXIST\"" ] }, - "1089": { + "1175": { "op": "log", "stack_out": [] }, - "1090": { + "1176": { "op": "err" }, - "1091": { + "1177": { "block": "remove_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -4986,67 +5266,7 @@ "id#0 (copy)" ] }, - "1093": { - "op": "len", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "1094": { - "op": "intc_2 // 2", - "defined_out": [ - "2", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "2" - ] - }, - "1095": { - "op": "==", - "defined_out": [ - "cond#0" - ], - "stack_out": [ - "cond#0" - ] - }, - "1096": { - "op": "bnz remove_label_after_if_else@7", - "stack_out": [] - }, - "1099": { - "op": "bytec 8 // \"ERR:LENGTH\"", - "defined_out": [ - "\"ERR:LENGTH\"" - ], - "stack_out": [ - "\"ERR:LENGTH\"" - ] - }, - "1101": { - "op": "log", - "stack_out": [] - }, - "1102": { - "op": "err" - }, - "1103": { - "block": "remove_label_after_if_else@7", - "stack_in": [], - "op": "frame_dig -1", - "defined_out": [ - "id#0 (copy)" - ], - "stack_out": [ - "id#0 (copy)" - ] - }, - "1105": { + "1179": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -5057,14 +5277,14 @@ "maybe_exists%1#0" ] }, - "1106": { + "1180": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "1107": { + "1181": { "error": "Index access is out of bounds", "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ @@ -5074,8 +5294,8 @@ "reinterpret_biguint%0#0" ] }, - "1110": { - "op": "bytec 9 // 0x0000000000000000", + "1184": { + "op": "bytec 8 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "reinterpret_biguint%0#0" @@ -5085,7 +5305,7 @@ "0x0000000000000000" ] }, - "1112": { + "1186": { "op": "b==", "defined_out": [ "cond#0" @@ -5094,12 +5314,12 @@ "cond#0" ] }, - "1113": { - "op": "bnz remove_label_after_if_else@11", + "1187": { + "op": "bnz remove_label_after_if_else@7", "stack_out": [] }, - "1116": { - "op": "bytec 10 // \"ERR:NOEMPTY\"", + "1190": { + "op": "bytec 9 // \"ERR:NOEMPTY\"", "defined_out": [ "\"ERR:NOEMPTY\"" ], @@ -5107,15 +5327,15 @@ "\"ERR:NOEMPTY\"" ] }, - "1118": { + "1192": { "op": "log", "stack_out": [] }, - "1119": { + "1193": { "op": "err" }, - "1120": { - "block": "remove_label_after_if_else@11", + "1194": { + "block": "remove_label_after_if_else@7", "stack_in": [], "op": "frame_dig -1", "defined_out": [ @@ -5125,7 +5345,7 @@ "id#0 (copy)" ] }, - "1122": { + "1196": { "op": "box_del", "defined_out": [ "{box_del}" @@ -5134,15 +5354,15 @@ "{box_del}" ] }, - "1123": { + "1197": { "op": "pop", "stack_out": [] }, - "1124": { + "1198": { "retsub": true, "op": "retsub" }, - "1125": { + "1199": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_label", "params": { "id#0": "bytes" @@ -5151,7 +5371,7 @@ "stack_in": [], "op": "proto 1 1" }, - "1128": { + "1202": { "op": "frame_dig -1", "defined_out": [ "id#0 (copy)" @@ -5160,7 +5380,7 @@ "id#0 (copy)" ] }, - "1130": { + "1204": { "op": "box_len", "defined_out": [ "cond#0", @@ -5171,17 +5391,17 @@ "cond#0" ] }, - "1131": { + "1205": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "1133": { + "1207": { "op": "bnz get_label_after_if_else@3", "stack_out": [] }, - "1136": { + "1210": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -5190,14 +5410,14 @@ "\"ERR:NOEXIST\"" ] }, - "1137": { + "1211": { "op": "log", "stack_out": [] }, - "1138": { + "1212": { "op": "err" }, - "1139": { + "1213": { "block": "get_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -5208,7 +5428,7 @@ "id#0 (copy)" ] }, - "1141": { + "1215": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -5219,18 +5439,18 @@ "maybe_exists%1#0" ] }, - "1142": { + "1216": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "1143": { + "1217": { "retsub": true, "op": "retsub" }, - "1144": { + "1218": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.log_labels", "params": { "ids#0": "bytes" @@ -5239,7 +5459,7 @@ "stack_in": [], "op": "proto 1 0" }, - "1147": { + "1221": { "op": "frame_dig -1", "defined_out": [ "ids#0 (copy)" @@ -5248,7 +5468,7 @@ "ids#0 (copy)" ] }, - "1149": { + "1223": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -5259,7 +5479,7 @@ "0" ] }, - "1150": { + "1224": { "op": "extract_uint16", "defined_out": [ "array_length%0#0" @@ -5268,7 +5488,7 @@ "array_length%0#0" ] }, - "1151": { + "1225": { "op": "intc_1 // 0", "defined_out": [ "_idx#0", @@ -5279,7 +5499,7 @@ "_idx#0" ] }, - "1152": { + "1226": { "block": "log_labels_for_header@1", "stack_in": [ "array_length%0#0", @@ -5295,7 +5515,7 @@ "_idx#0" ] }, - "1154": { + "1228": { "op": "frame_dig 0", "defined_out": [ "_idx#0", @@ -5308,7 +5528,7 @@ "array_length%0#0" ] }, - "1156": { + "1230": { "op": "<", "defined_out": [ "_idx#0", @@ -5321,14 +5541,14 @@ "continue_looping%0#0" ] }, - "1157": { + "1231": { "op": "bz log_labels_after_for@4", "stack_out": [ "array_length%0#0", "_idx#0" ] }, - "1160": { + "1234": { "op": "frame_dig -1", "defined_out": [ "_idx#0", @@ -5341,7 +5561,7 @@ "ids#0 (copy)" ] }, - "1162": { + "1236": { "op": "extract 2 0", "defined_out": [ "_idx#0", @@ -5354,7 +5574,7 @@ "array_head_and_tail%0#0" ] }, - "1165": { + "1239": { "op": "frame_dig 1", "stack_out": [ "array_length%0#0", @@ -5363,7 +5583,7 @@ "_idx#0" ] }, - "1167": { + "1241": { "op": "dup", "defined_out": [ "_idx#0", @@ -5379,7 +5599,7 @@ "_idx#0 (copy)" ] }, - "1168": { + "1242": { "op": "cover 2", "stack_out": [ "array_length%0#0", @@ -5389,7 +5609,7 @@ "_idx#0 (copy)" ] }, - "1170": { + "1244": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -5407,7 +5627,7 @@ "2" ] }, - "1171": { + "1245": { "op": "*", "defined_out": [ "_idx#0", @@ -5423,7 +5643,7 @@ "item_offset_offset%0#0" ] }, - "1172": { + "1246": { "op": "dig 1", "defined_out": [ "_idx#0", @@ -5441,7 +5661,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1174": { + "1248": { "op": "swap", "stack_out": [ "array_length%0#0", @@ -5452,7 +5672,7 @@ "item_offset_offset%0#0" ] }, - "1175": { + "1249": { "op": "extract_uint16", "defined_out": [ "_idx#0", @@ -5468,7 +5688,7 @@ "item_offset%0#0" ] }, - "1176": { + "1250": { "op": "dup2", "defined_out": [ "_idx#0", @@ -5488,7 +5708,7 @@ "item_offset%0#0 (copy)" ] }, - "1177": { + "1251": { "op": "extract_uint16", "defined_out": [ "_idx#0", @@ -5506,7 +5726,7 @@ "item_length%0#0" ] }, - "1178": { + "1252": { "op": "intc_2 // 2", "stack_out": [ "array_length%0#0", @@ -5518,7 +5738,7 @@ "2" ] }, - "1179": { + "1253": { "op": "+", "defined_out": [ "_idx#0", @@ -5536,7 +5756,7 @@ "item_head_tail_length%0#0" ] }, - "1180": { + "1254": { "op": "extract3", "defined_out": [ "_idx#0", @@ -5550,7 +5770,7 @@ "label_id#0" ] }, - "1181": { + "1255": { "op": "extract 2 0", "defined_out": [ "_idx#0", @@ -5564,7 +5784,7 @@ "tmp%0#0" ] }, - "1184": { + "1258": { "op": "box_get", "defined_out": [ "_idx#0", @@ -5580,7 +5800,7 @@ "maybe_exists%0#0" ] }, - "1185": { + "1259": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -5590,7 +5810,7 @@ "maybe_value%0#0" ] }, - "1186": { + "1260": { "op": "log", "stack_out": [ "array_length%0#0", @@ -5598,7 +5818,7 @@ "_idx#0" ] }, - "1187": { + "1261": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -5612,7 +5832,7 @@ "1" ] }, - "1188": { + "1262": { "op": "+", "stack_out": [ "array_length%0#0", @@ -5620,7 +5840,7 @@ "_idx#0" ] }, - "1189": { + "1263": { "op": "frame_bury 1", "defined_out": [ "_idx#0", @@ -5631,10 +5851,10 @@ "_idx#0" ] }, - "1191": { + "1265": { "op": "b log_labels_for_header@1" }, - "1194": { + "1268": { "block": "log_labels_after_for@4", "stack_in": [ "array_length%0#0", @@ -5643,7 +5863,7 @@ "retsub": true, "op": "retsub" }, - "1195": { + "1269": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "params": { "label#0": "bytes" @@ -5652,7 +5872,7 @@ "stack_in": [], "op": "proto 1 0" }, - "1198": { + "1272": { "op": "txn Sender", "defined_out": [ "tmp%0#0" @@ -5661,7 +5881,7 @@ "tmp%0#0" ] }, - "1200": { + "1274": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -5672,7 +5892,7 @@ "0" ] }, - "1201": { + "1275": { "op": "bytec 4 // \"admin\"", "defined_out": [ "\"admin\"", @@ -5685,7 +5905,7 @@ "\"admin\"" ] }, - "1203": { + "1277": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -5698,7 +5918,7 @@ "maybe_exists%0#0" ] }, - "1204": { + "1278": { "error": "check self.admin exists", "op": "assert // check self.admin exists", "stack_out": [ @@ -5706,7 +5926,7 @@ "maybe_value%0#0" ] }, - "1205": { + "1279": { "op": "==", "defined_out": [ "tmp%1#0" @@ -5715,15 +5935,15 @@ "tmp%1#0" ] }, - "1206": { + "1280": { "op": "bz admin_or_operator_only_after_if_else@2", "stack_out": [] }, - "1209": { + "1283": { "retsub": true, "op": "retsub" }, - "1210": { + "1284": { "block": "admin_or_operator_only_after_if_else@2", "stack_in": [], "op": "frame_dig -1", @@ -5734,16 +5954,16 @@ "label#0 (copy)" ] }, - "1212": { + "1286": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [] }, - "1215": { + "1289": { "retsub": true, "op": "retsub" }, - "1216": { + "1290": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "params": { "label#0": "bytes" @@ -5752,7 +5972,7 @@ "stack_in": [], "op": "proto 1 0" }, - "1219": { + "1293": { "op": "txn Sender", "defined_out": [ "tmp%0#0" @@ -5761,7 +5981,7 @@ "tmp%0#0" ] }, - "1221": { + "1295": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -5772,145 +5992,159 @@ "label#0 (copy)" ] }, - "1223": { + "1297": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ - "tmp%1#0" + "operator_index#0" ], "stack_out": [ - "tmp%1#0" + "operator_index#0" ] }, - "1226": { + "1300": { + "op": "dup", + "defined_out": [ + "operator_index#0" + ], + "stack_out": [ + "operator_index#0", + "operator_index#0" + ] + }, + "1301": { "op": "intc 5 // 4294967296", "defined_out": [ "4294967296", - "tmp%1#0" + "operator_index#0" ], "stack_out": [ - "tmp%1#0", + "operator_index#0", + "operator_index#0", "4294967296" ] }, - "1228": { + "1303": { "op": "!=", "defined_out": [ - "tmp%2#0" + "operator_index#0", + "tmp%1#0" ], "stack_out": [ - "tmp%2#0" + "operator_index#0", + "tmp%1#0" ] }, - "1229": { + "1304": { "op": "bz operator_only_bool_false@3", - "stack_out": [] - }, - "1232": { - "op": "txn Sender", - "defined_out": [ - "tmp%3#0" - ], "stack_out": [ - "tmp%3#0" + "operator_index#0" ] }, - "1234": { - "op": "frame_dig -1", + "1307": { + "op": "frame_dig 0", "stack_out": [ - "tmp%3#0", - "label#0 (copy)" + "operator_index#0", + "operator_index#0" ] }, - "1236": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", - "op": "callsub get_operator_label_index", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "1239": { + "1309": { "op": "intc 4 // 4294967295", "defined_out": [ "4294967295", - "tmp%4#0" + "operator_index#0" ], "stack_out": [ - "tmp%4#0", + "operator_index#0", + "operator_index#0", "4294967295" ] }, - "1241": { + "1311": { "op": "!=", "defined_out": [ - "tmp%5#0" + "operator_index#0", + "tmp%2#0" ], "stack_out": [ - "tmp%5#0" + "operator_index#0", + "tmp%2#0" ] }, - "1242": { + "1312": { "op": "bz operator_only_bool_false@3", - "stack_out": [] + "stack_out": [ + "operator_index#0" + ] }, - "1245": { + "1315": { "op": "intc_0 // 1", "defined_out": [ - "cond#0" + "cond#0", + "operator_index#0" ], "stack_out": [ + "operator_index#0", "cond#0" ] }, - "1246": { + "1316": { "block": "operator_only_bool_merge@4", "stack_in": [ + "operator_index#0", "cond#0" ], "op": "bnz operator_only_after_if_else@7", "defined_out": [], - "stack_out": [] + "stack_out": [ + "operator_index#0" + ] }, - "1249": { + "1319": { "op": "bytec 7 // \"ERR:UNAUTH\"", "defined_out": [ "\"ERR:UNAUTH\"" ], "stack_out": [ + "operator_index#0", "\"ERR:UNAUTH\"" ] }, - "1251": { + "1321": { "op": "log", - "stack_out": [] + "stack_out": [ + "operator_index#0" + ] }, - "1252": { + "1322": { "op": "err" }, - "1253": { + "1323": { "block": "operator_only_after_if_else@7", - "stack_in": [], + "stack_in": [ + "operator_index#0" + ], "retsub": true, "op": "retsub" }, - "1254": { + "1324": { "block": "operator_only_bool_false@3", - "stack_in": [], + "stack_in": [ + "operator_index#0" + ], "op": "intc_1 // 0", "defined_out": [ "cond#0" ], "stack_out": [ + "operator_index#0", "cond#0" ] }, - "1255": { + "1325": { "op": "b operator_only_bool_merge@4" }, - "1258": { + "1328": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "params": { "operator#0": "bytes", @@ -5920,20 +6154,20 @@ "stack_in": [], "op": "proto 2 1" }, - "1261": { + "1331": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#0" ] }, - "1262": { + "1332": { "op": "bytec_3 // \"\"", "stack_out": [ "maybe_value%1#0", "array_length%0#0" ] }, - "1263": { + "1333": { "op": "dup", "stack_out": [ "maybe_value%1#0", @@ -5941,7 +6175,7 @@ "idx#0" ] }, - "1264": { + "1334": { "op": "frame_dig -2", "defined_out": [ "operator#0 (copy)" @@ -5953,7 +6187,7 @@ "operator#0 (copy)" ] }, - "1266": { + "1336": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -5967,7 +6201,7 @@ "maybe_exists%0#0" ] }, - "1267": { + "1337": { "op": "bury 1", "stack_out": [ "maybe_value%1#0", @@ -5976,7 +6210,7 @@ "maybe_exists%0#0" ] }, - "1269": { + "1339": { "op": "bnz get_operator_label_index_after_if_else@2", "stack_out": [ "maybe_value%1#0", @@ -5984,7 +6218,7 @@ "idx#0" ] }, - "1272": { + "1342": { "op": "intc 5 // 4294967296", "defined_out": [ "4294967296" @@ -5996,14 +6230,14 @@ "4294967296" ] }, - "1274": { + "1344": { "op": "frame_bury 0" }, - "1276": { + "1346": { "retsub": true, "op": "retsub" }, - "1277": { + "1347": { "block": "get_operator_label_index_after_if_else@2", "stack_in": [ "maybe_value%1#0", @@ -6021,7 +6255,7 @@ "operator#0 (copy)" ] }, - "1279": { + "1349": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -6035,7 +6269,7 @@ "maybe_exists%1#0" ] }, - "1280": { + "1350": { "op": "swap", "stack_out": [ "maybe_value%1#0", @@ -6045,7 +6279,7 @@ "maybe_value%1#0" ] }, - "1281": { + "1351": { "op": "dup", "stack_out": [ "maybe_value%1#0", @@ -6056,7 +6290,7 @@ "maybe_value%1#0 (copy)" ] }, - "1282": { + "1352": { "op": "cover 2", "stack_out": [ "maybe_value%1#0", @@ -6067,7 +6301,7 @@ "maybe_value%1#0" ] }, - "1284": { + "1354": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%1#0", @@ -6081,7 +6315,7 @@ "maybe_exists%1#0" ] }, - "1286": { + "1356": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -6091,7 +6325,7 @@ "maybe_value%1#0" ] }, - "1287": { + "1357": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#0", @@ -6101,7 +6335,7 @@ "0" ] }, - "1288": { + "1358": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -6114,7 +6348,7 @@ "array_length%0#0" ] }, - "1289": { + "1359": { "op": "frame_bury 1", "defined_out": [ "array_length%0#0", @@ -6126,7 +6360,7 @@ "idx#0" ] }, - "1291": { + "1361": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -6140,7 +6374,7 @@ "idx#0" ] }, - "1292": { + "1362": { "op": "frame_bury 2", "defined_out": [ "array_length%0#0", @@ -6153,7 +6387,7 @@ "idx#0" ] }, - "1294": { + "1364": { "block": "get_operator_label_index_for_header@3", "stack_in": [ "maybe_value%1#0", @@ -6171,7 +6405,7 @@ "idx#0" ] }, - "1296": { + "1366": { "op": "frame_dig 1", "defined_out": [ "array_length%0#0", @@ -6185,7 +6419,7 @@ "array_length%0#0" ] }, - "1298": { + "1368": { "op": "<", "defined_out": [ "array_length%0#0", @@ -6199,7 +6433,7 @@ "continue_looping%0#0" ] }, - "1299": { + "1369": { "op": "bz get_operator_label_index_after_for@8", "stack_out": [ "maybe_value%1#0", @@ -6207,7 +6441,7 @@ "idx#0" ] }, - "1302": { + "1372": { "op": "frame_dig 0", "defined_out": [ "array_length%0#0", @@ -6221,7 +6455,7 @@ "maybe_value%1#0" ] }, - "1304": { + "1374": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -6236,7 +6470,7 @@ "array_head_and_tail%0#0" ] }, - "1307": { + "1377": { "op": "frame_dig 2", "stack_out": [ "maybe_value%1#0", @@ -6246,7 +6480,7 @@ "idx#0" ] }, - "1309": { + "1379": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -6264,7 +6498,7 @@ "2" ] }, - "1310": { + "1380": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -6281,7 +6515,7 @@ "item_offset_offset%0#0" ] }, - "1311": { + "1381": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -6300,7 +6534,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1313": { + "1383": { "op": "swap", "stack_out": [ "maybe_value%1#0", @@ -6311,7 +6545,7 @@ "item_offset_offset%0#0" ] }, - "1314": { + "1384": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -6328,7 +6562,7 @@ "item_offset%0#0" ] }, - "1315": { + "1385": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -6349,7 +6583,7 @@ "item_offset%0#0 (copy)" ] }, - "1316": { + "1386": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -6368,7 +6602,7 @@ "item_length%0#0" ] }, - "1317": { + "1387": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%1#0", @@ -6380,7 +6614,7 @@ "2" ] }, - "1318": { + "1388": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -6399,7 +6633,7 @@ "item_head_tail_length%0#0" ] }, - "1319": { + "1389": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -6414,7 +6648,7 @@ "stored_label#0" ] }, - "1320": { + "1390": { "op": "extract 2 0", "defined_out": [ "array_length%0#0", @@ -6429,7 +6663,7 @@ "tmp%2#0" ] }, - "1323": { + "1393": { "op": "frame_dig -1", "defined_out": [ "array_length%0#0", @@ -6446,7 +6680,7 @@ "label#0 (copy)" ] }, - "1325": { + "1395": { "op": "==", "defined_out": [ "array_length%0#0", @@ -6461,7 +6695,7 @@ "tmp%3#0" ] }, - "1326": { + "1396": { "op": "bz get_operator_label_index_after_if_else@6", "stack_out": [ "maybe_value%1#0", @@ -6469,7 +6703,7 @@ "idx#0" ] }, - "1329": { + "1399": { "op": "frame_dig 2", "stack_out": [ "maybe_value%1#0", @@ -6478,14 +6712,14 @@ "idx#0" ] }, - "1331": { + "1401": { "op": "frame_bury 0" }, - "1333": { + "1403": { "retsub": true, "op": "retsub" }, - "1334": { + "1404": { "block": "get_operator_label_index_after_if_else@6", "stack_in": [ "maybe_value%1#0", @@ -6503,7 +6737,7 @@ "idx#0" ] }, - "1336": { + "1406": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -6517,7 +6751,7 @@ "1" ] }, - "1337": { + "1407": { "op": "+", "stack_out": [ "maybe_value%1#0", @@ -6526,7 +6760,7 @@ "idx#0" ] }, - "1338": { + "1408": { "op": "frame_bury 2", "defined_out": [ "idx#0" @@ -6537,10 +6771,10 @@ "idx#0" ] }, - "1340": { + "1410": { "op": "b get_operator_label_index_for_header@3" }, - "1343": { + "1413": { "block": "get_operator_label_index_after_for@8", "stack_in": [ "maybe_value%1#0", @@ -6558,14 +6792,14 @@ "4294967295" ] }, - "1345": { + "1415": { "op": "frame_bury 0" }, - "1347": { + "1417": { "retsub": true, "op": "retsub" }, - "1348": { + "1418": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label", "params": { "operator#0": "bytes", @@ -6575,7 +6809,7 @@ "stack_in": [], "op": "proto 2 0" }, - "1351": { + "1421": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)" @@ -6584,18 +6818,18 @@ "label#0 (copy)" ] }, - "1353": { + "1423": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "op": "callsub admin_or_operator_only", "stack_out": [] }, - "1356": { + "1426": { "op": "frame_dig -1", "stack_out": [ "label#0 (copy)" ] }, - "1358": { + "1428": { "op": "box_len", "defined_out": [ "cond#0", @@ -6606,17 +6840,17 @@ "cond#0" ] }, - "1359": { + "1429": { "op": "bury 1", "stack_out": [ "cond#0" ] }, - "1361": { + "1431": { "op": "bnz add_operator_to_label_after_if_else@10", "stack_out": [] }, - "1364": { + "1434": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -6625,14 +6859,14 @@ "\"ERR:NOEXIST\"" ] }, - "1365": { + "1435": { "op": "log", "stack_out": [] }, - "1366": { + "1436": { "op": "err" }, - "1367": { + "1437": { "block": "add_operator_to_label_after_if_else@10", "stack_in": [], "op": "frame_dig -2", @@ -6643,7 +6877,7 @@ "operator#0 (copy)" ] }, - "1369": { + "1439": { "op": "box_len", "defined_out": [ "maybe_exists%1#0", @@ -6654,23 +6888,23 @@ "maybe_exists%1#0" ] }, - "1370": { + "1440": { "op": "bury 1", "stack_out": [ "maybe_exists%1#0" ] }, - "1372": { + "1442": { "op": "bz add_operator_to_label_else_body@2", "stack_out": [] }, - "1375": { + "1445": { "op": "frame_dig -2", "stack_out": [ "operator#0 (copy)" ] }, - "1377": { + "1447": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -6681,7 +6915,7 @@ "label#0 (copy)" ] }, - "1379": { + "1449": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -6691,7 +6925,7 @@ "tmp%2#0" ] }, - "1382": { + "1452": { "op": "intc 4 // 4294967295", "defined_out": [ "4294967295", @@ -6702,7 +6936,7 @@ "4294967295" ] }, - "1384": { + "1454": { "op": "==", "defined_out": [ "cond#0" @@ -6711,11 +6945,11 @@ "cond#0" ] }, - "1385": { + "1455": { "op": "bnz add_operator_to_label_after_if_else@6", "stack_out": [] }, - "1388": { + "1458": { "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -6724,14 +6958,14 @@ "\"ERR:EXISTS\"" ] }, - "1390": { + "1460": { "op": "log", "stack_out": [] }, - "1391": { + "1461": { "op": "err" }, - "1392": { + "1462": { "block": "add_operator_to_label_after_if_else@6", "stack_in": [], "op": "frame_dig -2", @@ -6742,7 +6976,7 @@ "operator#0 (copy)" ] }, - "1394": { + "1464": { "op": "box_get", "defined_out": [ "existing#0", @@ -6753,14 +6987,14 @@ "maybe_exists%2#0" ] }, - "1395": { + "1465": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ "existing#0" ] }, - "1396": { + "1466": { "op": "frame_dig -1", "defined_out": [ "existing#0", @@ -6771,7 +7005,7 @@ "label#0 (copy)" ] }, - "1398": { + "1468": { "op": "len", "defined_out": [ "existing#0", @@ -6782,7 +7016,7 @@ "length%0#0" ] }, - "1399": { + "1469": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -6793,7 +7027,7 @@ "as_bytes%0#0" ] }, - "1400": { + "1470": { "op": "extract 6 2", "defined_out": [ "existing#0", @@ -6804,7 +7038,7 @@ "length_uint16%0#0" ] }, - "1403": { + "1473": { "op": "frame_dig -1", "stack_out": [ "existing#0", @@ -6812,7 +7046,7 @@ "label#0 (copy)" ] }, - "1405": { + "1475": { "op": "concat", "defined_out": [ "encoded_value%0#0", @@ -6823,7 +7057,7 @@ "encoded_value%0#0" ] }, - "1406": { + "1476": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -6836,21 +7070,21 @@ "1" ] }, - "1407": { + "1477": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ "existing#0" ] }, - "1410": { + "1480": { "op": "frame_dig -2", "stack_out": [ "existing#0", "operator#0 (copy)" ] }, - "1412": { + "1482": { "op": "box_del", "defined_out": [ "existing#0", @@ -6861,31 +7095,31 @@ "{box_del}" ] }, - "1413": { + "1483": { "op": "pop", "stack_out": [ "existing#0" ] }, - "1414": { + "1484": { "op": "frame_dig -2", "stack_out": [ "existing#0", "operator#0 (copy)" ] }, - "1416": { + "1486": { "op": "swap", "stack_out": [ "operator#0 (copy)", "existing#0" ] }, - "1417": { + "1487": { "op": "box_put", "stack_out": [] }, - "1418": { + "1488": { "block": "add_operator_to_label_after_if_else@3", "stack_in": [], "op": "frame_dig -1", @@ -6896,7 +7130,7 @@ "label#0 (copy)" ] }, - "1420": { + "1490": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -6907,14 +7141,14 @@ "maybe_exists%3#0" ] }, - "1421": { + "1491": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ "label_descriptor#0" ] }, - "1422": { + "1492": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -6925,7 +7159,7 @@ "label_descriptor#0 (copy)" ] }, - "1423": { + "1493": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -6938,7 +7172,7 @@ "10" ] }, - "1425": { + "1495": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -6949,7 +7183,7 @@ "tmp%9#0" ] }, - "1426": { + "1496": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -6962,7 +7196,7 @@ "1" ] }, - "1427": { + "1497": { "op": "+", "defined_out": [ "label_descriptor#0", @@ -6973,7 +7207,7 @@ "to_encode%0#0" ] }, - "1428": { + "1498": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -6984,20 +7218,20 @@ "val_as_bytes%0#0" ] }, - "1429": { + "1499": { "op": "replace2 10", "stack_out": [ "label_descriptor#0" ] }, - "1431": { + "1501": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "label#0 (copy)" ] }, - "1433": { + "1503": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -7008,35 +7242,35 @@ "{box_del}" ] }, - "1434": { + "1504": { "op": "pop", "stack_out": [ "label_descriptor#0" ] }, - "1435": { + "1505": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", "label#0 (copy)" ] }, - "1437": { + "1507": { "op": "swap", "stack_out": [ "label#0 (copy)", "label_descriptor#0" ] }, - "1438": { + "1508": { "op": "box_put", "stack_out": [] }, - "1439": { + "1509": { "retsub": true, "op": "retsub" }, - "1440": { + "1510": { "block": "add_operator_to_label_else_body@2", "stack_in": [], "op": "frame_dig -1", @@ -7047,7 +7281,7 @@ "label#0 (copy)" ] }, - "1442": { + "1512": { "op": "len", "defined_out": [ "length%1#0" @@ -7056,7 +7290,7 @@ "length%1#0" ] }, - "1443": { + "1513": { "op": "itob", "defined_out": [ "as_bytes%1#0" @@ -7065,7 +7299,7 @@ "as_bytes%1#0" ] }, - "1444": { + "1514": { "op": "extract 6 2", "defined_out": [ "length_uint16%1#0" @@ -7074,14 +7308,14 @@ "length_uint16%1#0" ] }, - "1447": { + "1517": { "op": "frame_dig -1", "stack_out": [ "length_uint16%1#0", "label#0 (copy)" ] }, - "1449": { + "1519": { "op": "concat", "defined_out": [ "encoded_value%1#0" @@ -7090,7 +7324,7 @@ "encoded_value%1#0" ] }, - "1450": { + "1520": { "op": "bytec 6 // 0x0002", "defined_out": [ "0x0002", @@ -7101,14 +7335,14 @@ "0x0002" ] }, - "1452": { + "1522": { "op": "swap", "stack_out": [ "0x0002", "encoded_value%1#0" ] }, - "1453": { + "1523": { "op": "concat", "defined_out": [ "result%1#0" @@ -7117,8 +7351,8 @@ "result%1#0" ] }, - "1454": { - "op": "bytec 11 // 0x0001", + "1524": { + "op": "bytec 10 // 0x0001", "defined_out": [ "0x0001", "result%1#0" @@ -7128,14 +7362,14 @@ "0x0001" ] }, - "1456": { + "1526": { "op": "swap", "stack_out": [ "0x0001", "result%1#0" ] }, - "1457": { + "1527": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -7144,7 +7378,7 @@ "array_data%0#0" ] }, - "1458": { + "1528": { "op": "frame_dig -2", "defined_out": [ "array_data%0#0", @@ -7155,7 +7389,7 @@ "operator#0 (copy)" ] }, - "1460": { + "1530": { "op": "box_del", "defined_out": [ "array_data%0#0", @@ -7166,34 +7400,34 @@ "{box_del}" ] }, - "1461": { + "1531": { "op": "pop", "stack_out": [ "array_data%0#0" ] }, - "1462": { + "1532": { "op": "frame_dig -2", "stack_out": [ "array_data%0#0", "operator#0 (copy)" ] }, - "1464": { + "1534": { "op": "swap", "stack_out": [ "operator#0 (copy)", "array_data%0#0" ] }, - "1465": { + "1535": { "op": "box_put", "stack_out": [] }, - "1466": { + "1536": { "op": "b add_operator_to_label_after_if_else@3" }, - "1469": { + "1539": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label", "params": { "operator#0": "bytes", @@ -7203,13 +7437,13 @@ "stack_in": [], "op": "proto 2 0" }, - "1472": { + "1542": { "op": "intc_1 // 0", "stack_out": [ "label_descriptor#0" ] }, - "1473": { + "1543": { "op": "dupn 4", "stack_out": [ "label_descriptor#0", @@ -7219,7 +7453,7 @@ "stored_label#0" ] }, - "1475": { + "1545": { "op": "bytec_3 // \"\"", "stack_out": [ "label_descriptor#0", @@ -7230,7 +7464,7 @@ "array_length%0#0" ] }, - "1476": { + "1546": { "op": "dupn 2", "stack_out": [ "label_descriptor#0", @@ -7243,7 +7477,7 @@ "label_idx#0" ] }, - "1478": { + "1548": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)" @@ -7260,7 +7494,7 @@ "label#0 (copy)" ] }, - "1480": { + "1550": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only", "op": "callsub admin_or_operator_only", "stack_out": [ @@ -7274,7 +7508,7 @@ "label_idx#0" ] }, - "1483": { + "1553": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", @@ -7288,7 +7522,7 @@ "label#0 (copy)" ] }, - "1485": { + "1555": { "op": "box_len", "defined_out": [ "cond#0", @@ -7307,7 +7541,7 @@ "cond#0" ] }, - "1486": { + "1556": { "op": "bury 1", "stack_out": [ "label_descriptor#0", @@ -7321,7 +7555,7 @@ "cond#0" ] }, - "1488": { + "1558": { "op": "bnz remove_operator_from_label_after_if_else@28", "stack_out": [ "label_descriptor#0", @@ -7334,7 +7568,7 @@ "label_idx#0" ] }, - "1491": { + "1561": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -7351,7 +7585,7 @@ "\"ERR:NOEXIST\"" ] }, - "1492": { + "1562": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -7364,10 +7598,10 @@ "label_idx#0" ] }, - "1493": { + "1563": { "op": "err" }, - "1494": { + "1564": { "block": "remove_operator_from_label_after_if_else@28", "stack_in": [ "label_descriptor#0", @@ -7395,7 +7629,7 @@ "operator#0 (copy)" ] }, - "1496": { + "1566": { "op": "box_len", "defined_out": [ "cond#0", @@ -7414,7 +7648,7 @@ "cond#0" ] }, - "1497": { + "1567": { "op": "bury 1", "stack_out": [ "label_descriptor#0", @@ -7428,7 +7662,7 @@ "cond#0" ] }, - "1499": { + "1569": { "op": "bnz remove_operator_from_label_after_if_else@32", "stack_out": [ "label_descriptor#0", @@ -7441,7 +7675,7 @@ "label_idx#0" ] }, - "1502": { + "1572": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -7458,7 +7692,7 @@ "\"ERR:NOEXIST\"" ] }, - "1503": { + "1573": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -7471,10 +7705,10 @@ "label_idx#0" ] }, - "1504": { + "1574": { "op": "err" }, - "1505": { + "1575": { "block": "remove_operator_from_label_after_if_else@32", "stack_in": [ "label_descriptor#0", @@ -7502,7 +7736,7 @@ "operator#0 (copy)" ] }, - "1507": { + "1577": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -7521,7 +7755,7 @@ "label#0 (copy)" ] }, - "1509": { + "1579": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index", "op": "callsub get_operator_label_index", "defined_out": [ @@ -7539,7 +7773,7 @@ "label_idx#0" ] }, - "1512": { + "1582": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -7554,7 +7788,7 @@ "label_idx#0" ] }, - "1513": { + "1583": { "op": "frame_bury 7", "defined_out": [ "label_idx#0" @@ -7571,7 +7805,7 @@ "label_idx#0" ] }, - "1515": { + "1585": { "op": "intc 4 // 4294967295", "defined_out": [ "4294967295", @@ -7590,7 +7824,7 @@ "4294967295" ] }, - "1517": { + "1587": { "op": "!=", "defined_out": [ "label_idx#0", @@ -7608,7 +7842,7 @@ "tmp%2#0" ] }, - "1518": { + "1588": { "op": "bz remove_operator_from_label_bool_false@3", "stack_out": [ "label_descriptor#0", @@ -7621,7 +7855,7 @@ "label_idx#0" ] }, - "1521": { + "1591": { "op": "frame_dig 7", "stack_out": [ "label_descriptor#0", @@ -7635,7 +7869,7 @@ "label_idx#0" ] }, - "1523": { + "1593": { "op": "intc 5 // 4294967296", "defined_out": [ "4294967296", @@ -7654,7 +7888,7 @@ "4294967296" ] }, - "1525": { + "1595": { "op": "!=", "defined_out": [ "label_idx#0", @@ -7672,7 +7906,7 @@ "tmp%3#0" ] }, - "1526": { + "1596": { "op": "bz remove_operator_from_label_bool_false@3", "stack_out": [ "label_descriptor#0", @@ -7685,7 +7919,7 @@ "label_idx#0" ] }, - "1529": { + "1599": { "op": "intc_0 // 1", "defined_out": [ "cond#0", @@ -7703,7 +7937,7 @@ "cond#0" ] }, - "1530": { + "1600": { "block": "remove_operator_from_label_bool_merge@4", "stack_in": [ "label_descriptor#0", @@ -7729,7 +7963,7 @@ "label_idx#0" ] }, - "1533": { + "1603": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -7746,7 +7980,7 @@ "\"ERR:NOEXIST\"" ] }, - "1534": { + "1604": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -7759,10 +7993,10 @@ "label_idx#0" ] }, - "1535": { + "1605": { "op": "err" }, - "1536": { + "1606": { "block": "remove_operator_from_label_after_if_else@24", "stack_in": [ "label_descriptor#0", @@ -7790,7 +8024,7 @@ "label#0 (copy)" ] }, - "1538": { + "1608": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -7809,7 +8043,7 @@ "maybe_exists%2#0" ] }, - "1539": { + "1609": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -7824,7 +8058,7 @@ "label_descriptor#0" ] }, - "1540": { + "1610": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -7840,7 +8074,7 @@ "label_descriptor#0 (copy)" ] }, - "1541": { + "1611": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -7856,7 +8090,7 @@ "label_descriptor#0" ] }, - "1543": { + "1613": { "op": "frame_bury 0", "defined_out": [ "label_descriptor#0", @@ -7875,7 +8109,7 @@ "maybe_exists%2#0" ] }, - "1545": { + "1615": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -7890,7 +8124,7 @@ "label_descriptor#0" ] }, - "1546": { + "1616": { "error": "Index access is out of bounds", "op": "extract 10 8 // on error: Index access is out of bounds", "defined_out": [ @@ -7909,7 +8143,7 @@ "reinterpret_biguint%0#0" ] }, - "1549": { + "1619": { "op": "pushbytes 0x0000000000000001", "defined_out": [ "0x0000000000000001", @@ -7929,7 +8163,7 @@ "0x0000000000000001" ] }, - "1559": { + "1629": { "op": "b>", "defined_out": [ "label_descriptor#0", @@ -7947,7 +8181,7 @@ "tmp%5#0" ] }, - "1560": { + "1630": { "op": "bnz remove_operator_from_label_bool_true@6", "stack_out": [ "label_descriptor#0", @@ -7960,7 +8194,7 @@ "label_idx#0" ] }, - "1563": { + "1633": { "op": "frame_dig 0", "stack_out": [ "label_descriptor#0", @@ -7974,7 +8208,7 @@ "label_descriptor#0" ] }, - "1565": { + "1635": { "error": "Index access is out of bounds", "op": "extract 2 8 // on error: Index access is out of bounds", "defined_out": [ @@ -7993,8 +8227,8 @@ "reinterpret_biguint%2#0" ] }, - "1568": { - "op": "bytec 9 // 0x0000000000000000", + "1638": { + "op": "bytec 8 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "label_descriptor#0", @@ -8013,7 +8247,7 @@ "0x0000000000000000" ] }, - "1570": { + "1640": { "op": "b==", "defined_out": [ "label_descriptor#0", @@ -8031,7 +8265,7 @@ "tmp%6#0" ] }, - "1571": { + "1641": { "op": "bz remove_operator_from_label_bool_false@7", "stack_out": [ "label_descriptor#0", @@ -8044,7 +8278,7 @@ "label_idx#0" ] }, - "1574": { + "1644": { "block": "remove_operator_from_label_bool_true@6", "stack_in": [ "label_descriptor#0", @@ -8072,7 +8306,7 @@ "cond#0" ] }, - "1575": { + "1645": { "block": "remove_operator_from_label_bool_merge@8", "stack_in": [ "label_descriptor#0", @@ -8098,8 +8332,8 @@ "label_idx#0" ] }, - "1578": { - "op": "bytec 10 // \"ERR:NOEMPTY\"", + "1648": { + "op": "bytec 9 // \"ERR:NOEMPTY\"", "defined_out": [ "\"ERR:NOEMPTY\"" ], @@ -8115,7 +8349,7 @@ "\"ERR:NOEMPTY\"" ] }, - "1580": { + "1650": { "op": "log", "stack_out": [ "label_descriptor#0", @@ -8128,10 +8362,10 @@ "label_idx#0" ] }, - "1581": { + "1651": { "op": "err" }, - "1582": { + "1652": { "block": "remove_operator_from_label_after_if_else@20", "stack_in": [ "label_descriptor#0", @@ -8159,7 +8393,7 @@ "label_descriptor#0" ] }, - "1584": { + "1654": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -8178,7 +8412,7 @@ "label_descriptor#0 (copy)" ] }, - "1585": { + "1655": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -8199,7 +8433,7 @@ "10" ] }, - "1587": { + "1657": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -8218,7 +8452,7 @@ "tmp%8#0" ] }, - "1588": { + "1658": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -8239,7 +8473,7 @@ "1" ] }, - "1589": { + "1659": { "op": "-", "defined_out": [ "label_descriptor#0", @@ -8258,7 +8492,7 @@ "to_encode%0#0" ] }, - "1590": { + "1660": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -8277,7 +8511,7 @@ "val_as_bytes%0#0" ] }, - "1591": { + "1661": { "op": "replace2 10", "stack_out": [ "label_descriptor#0", @@ -8291,7 +8525,7 @@ "label_descriptor#0" ] }, - "1593": { + "1663": { "op": "frame_dig -1", "defined_out": [ "label#0 (copy)", @@ -8310,7 +8544,7 @@ "label#0 (copy)" ] }, - "1595": { + "1665": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -8329,7 +8563,7 @@ "{box_del}" ] }, - "1596": { + "1666": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -8343,7 +8577,7 @@ "label_descriptor#0" ] }, - "1597": { + "1667": { "op": "frame_dig -1", "stack_out": [ "label_descriptor#0", @@ -8358,7 +8592,7 @@ "label#0 (copy)" ] }, - "1599": { + "1669": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -8373,7 +8607,7 @@ "label_descriptor#0" ] }, - "1600": { + "1670": { "op": "box_put", "stack_out": [ "label_descriptor#0", @@ -8386,7 +8620,7 @@ "label_idx#0" ] }, - "1601": { + "1671": { "op": "frame_dig -2", "defined_out": [ "label_descriptor#0", @@ -8404,7 +8638,7 @@ "operator#0 (copy)" ] }, - "1603": { + "1673": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -8424,7 +8658,7 @@ "maybe_exists%3#0" ] }, - "1604": { + "1674": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -8439,7 +8673,7 @@ "maybe_value%3#0" ] }, - "1605": { + "1675": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -8459,7 +8693,7 @@ "0" ] }, - "1606": { + "1676": { "op": "extract_uint16", "defined_out": [ "label_descriptor#0", @@ -8477,7 +8711,7 @@ "tmp%11#0" ] }, - "1607": { + "1677": { "op": "intc_0 // 1", "stack_out": [ "label_descriptor#0", @@ -8492,7 +8726,7 @@ "1" ] }, - "1608": { + "1678": { "op": "==", "defined_out": [ "label_descriptor#0", @@ -8510,7 +8744,7 @@ "tmp%12#0" ] }, - "1609": { + "1679": { "op": "bz remove_operator_from_label_else_body@10", "stack_out": [ "label_descriptor#0", @@ -8523,7 +8757,7 @@ "label_idx#0" ] }, - "1612": { + "1682": { "op": "frame_dig -2", "stack_out": [ "label_descriptor#0", @@ -8537,7 +8771,7 @@ "operator#0 (copy)" ] }, - "1614": { + "1684": { "op": "box_del", "stack_out": [ "label_descriptor#0", @@ -8551,7 +8785,7 @@ "{box_del}" ] }, - "1615": { + "1685": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -8564,11 +8798,11 @@ "label_idx#0" ] }, - "1616": { + "1686": { "retsub": true, "op": "retsub" }, - "1617": { + "1687": { "block": "remove_operator_from_label_else_body@10", "stack_in": [ "label_descriptor#0", @@ -8596,7 +8830,7 @@ "next_list#0" ] }, - "1618": { + "1688": { "op": "frame_bury 2", "defined_out": [ "next_list#0" @@ -8612,7 +8846,7 @@ "label_idx#0" ] }, - "1620": { + "1690": { "op": "frame_dig -2", "defined_out": [ "next_list#0", @@ -8630,7 +8864,7 @@ "operator#0 (copy)" ] }, - "1622": { + "1692": { "op": "box_get", "defined_out": [ "maybe_exists%4#0", @@ -8650,7 +8884,7 @@ "maybe_exists%4#0" ] }, - "1623": { + "1693": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -8665,7 +8899,7 @@ "maybe_value%4#0" ] }, - "1624": { + "1694": { "op": "dup", "stack_out": [ "label_descriptor#0", @@ -8681,7 +8915,7 @@ "maybe_value%4#0 (copy)" ] }, - "1625": { + "1695": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -8697,7 +8931,7 @@ "maybe_value%4#0" ] }, - "1627": { + "1697": { "op": "frame_bury 1", "defined_out": [ "maybe_exists%4#0", @@ -8717,7 +8951,7 @@ "maybe_exists%4#0" ] }, - "1629": { + "1699": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ @@ -8732,7 +8966,7 @@ "maybe_value%4#0" ] }, - "1630": { + "1700": { "op": "intc_1 // 0", "stack_out": [ "label_descriptor#0", @@ -8747,7 +8981,7 @@ "0" ] }, - "1631": { + "1701": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -8766,7 +9000,7 @@ "array_length%0#0" ] }, - "1632": { + "1702": { "op": "frame_bury 5", "defined_out": [ "array_length%0#0", @@ -8784,7 +9018,7 @@ "label_idx#0" ] }, - "1634": { + "1704": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -8804,7 +9038,7 @@ "idx#0" ] }, - "1635": { + "1705": { "op": "frame_bury 6", "defined_out": [ "array_length%0#0", @@ -8823,7 +9057,7 @@ "label_idx#0" ] }, - "1637": { + "1707": { "block": "remove_operator_from_label_for_header@11", "stack_in": [ "label_descriptor#0", @@ -8851,7 +9085,7 @@ "idx#0" ] }, - "1639": { + "1709": { "op": "frame_dig 5", "defined_out": [ "array_length%0#0", @@ -8870,7 +9104,7 @@ "array_length%0#0" ] }, - "1641": { + "1711": { "op": "<", "defined_out": [ "array_length%0#0", @@ -8889,7 +9123,7 @@ "continue_looping%0#0" ] }, - "1642": { + "1712": { "op": "bz remove_operator_from_label_after_for@16", "stack_out": [ "label_descriptor#0", @@ -8902,7 +9136,7 @@ "label_idx#0" ] }, - "1645": { + "1715": { "op": "frame_dig 1", "defined_out": [ "array_length%0#0", @@ -8921,7 +9155,7 @@ "maybe_value%4#0" ] }, - "1647": { + "1717": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -8941,7 +9175,7 @@ "array_head_and_tail%0#0" ] }, - "1650": { + "1720": { "op": "frame_dig 6", "stack_out": [ "label_descriptor#0", @@ -8956,7 +9190,7 @@ "idx#0" ] }, - "1652": { + "1722": { "op": "dup", "defined_out": [ "array_head_and_tail%0#0", @@ -8979,7 +9213,7 @@ "idx#0 (copy)" ] }, - "1653": { + "1723": { "op": "cover 2", "stack_out": [ "label_descriptor#0", @@ -8995,7 +9229,7 @@ "idx#0 (copy)" ] }, - "1655": { + "1725": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -9020,7 +9254,7 @@ "2" ] }, - "1656": { + "1726": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -9043,7 +9277,7 @@ "item_offset_offset%0#0" ] }, - "1657": { + "1727": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -9068,7 +9302,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1659": { + "1729": { "op": "swap", "stack_out": [ "label_descriptor#0", @@ -9085,7 +9319,7 @@ "item_offset_offset%0#0" ] }, - "1660": { + "1730": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -9108,7 +9342,7 @@ "item_offset%0#0" ] }, - "1661": { + "1731": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -9135,7 +9369,7 @@ "item_offset%0#0 (copy)" ] }, - "1662": { + "1732": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -9160,7 +9394,7 @@ "item_length%0#0" ] }, - "1663": { + "1733": { "op": "intc_2 // 2", "stack_out": [ "label_descriptor#0", @@ -9178,7 +9412,7 @@ "2" ] }, - "1664": { + "1734": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -9203,7 +9437,7 @@ "item_head_tail_length%0#0" ] }, - "1665": { + "1735": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -9224,7 +9458,7 @@ "stored_label#0" ] }, - "1666": { + "1736": { "op": "frame_bury 4", "defined_out": [ "array_length%0#0", @@ -9244,7 +9478,7 @@ "idx#0" ] }, - "1668": { + "1738": { "op": "frame_dig 7", "defined_out": [ "array_length%0#0", @@ -9266,7 +9500,7 @@ "label_idx#0" ] }, - "1670": { + "1740": { "op": "!=", "defined_out": [ "array_length%0#0", @@ -9288,7 +9522,7 @@ "tmp%15#0" ] }, - "1671": { + "1741": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -9312,7 +9546,7 @@ "next_list#9" ] }, - "1673": { + "1743": { "op": "frame_bury 3", "defined_out": [ "array_length%0#0", @@ -9335,7 +9569,7 @@ "tmp%15#0" ] }, - "1675": { + "1745": { "op": "bz remove_operator_from_label_after_if_else@14", "stack_out": [ "label_descriptor#0", @@ -9348,7 +9582,7 @@ "label_idx#0" ] }, - "1678": { + "1748": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -9371,7 +9605,7 @@ "next_list#0" ] }, - "1680": { + "1750": { "op": "frame_dig 4", "stack_out": [ "label_descriptor#0", @@ -9386,7 +9620,7 @@ "stored_label#0" ] }, - "1682": { + "1752": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -9412,7 +9646,7 @@ "1" ] }, - "1683": { + "1753": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -9427,7 +9661,7 @@ "next_list#9" ] }, - "1686": { + "1756": { "op": "frame_bury 3", "stack_out": [ "label_descriptor#0", @@ -9440,7 +9674,7 @@ "label_idx#0" ] }, - "1688": { + "1758": { "block": "remove_operator_from_label_after_if_else@14", "stack_in": [ "label_descriptor#0", @@ -9468,7 +9702,7 @@ "next_list#0" ] }, - "1690": { + "1760": { "op": "frame_bury 2", "defined_out": [ "next_list#0" @@ -9484,7 +9718,7 @@ "label_idx#0" ] }, - "1692": { + "1762": { "op": "frame_dig 6", "defined_out": [ "idx#0", @@ -9502,7 +9736,7 @@ "idx#0" ] }, - "1694": { + "1764": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -9522,7 +9756,7 @@ "1" ] }, - "1695": { + "1765": { "op": "+", "stack_out": [ "label_descriptor#0", @@ -9536,7 +9770,7 @@ "idx#0" ] }, - "1696": { + "1766": { "op": "frame_bury 6", "defined_out": [ "idx#0", @@ -9553,10 +9787,10 @@ "label_idx#0" ] }, - "1698": { + "1768": { "op": "b remove_operator_from_label_for_header@11" }, - "1701": { + "1771": { "block": "remove_operator_from_label_after_for@16", "stack_in": [ "label_descriptor#0", @@ -9584,7 +9818,7 @@ "operator#0 (copy)" ] }, - "1703": { + "1773": { "op": "box_del", "defined_out": [ "{box_del}" @@ -9601,7 +9835,7 @@ "{box_del}" ] }, - "1704": { + "1774": { "op": "pop", "stack_out": [ "label_descriptor#0", @@ -9614,7 +9848,7 @@ "label_idx#0" ] }, - "1705": { + "1775": { "op": "frame_dig -2", "stack_out": [ "label_descriptor#0", @@ -9628,7 +9862,7 @@ "operator#0 (copy)" ] }, - "1707": { + "1777": { "op": "frame_dig 2", "defined_out": [ "next_list#0", @@ -9647,7 +9881,7 @@ "next_list#0" ] }, - "1709": { + "1779": { "op": "box_put", "stack_out": [ "label_descriptor#0", @@ -9660,11 +9894,11 @@ "label_idx#0" ] }, - "1710": { + "1780": { "retsub": true, "op": "retsub" }, - "1711": { + "1781": { "block": "remove_operator_from_label_bool_false@7", "stack_in": [ "label_descriptor#0", @@ -9692,10 +9926,10 @@ "cond#0" ] }, - "1712": { + "1782": { "op": "b remove_operator_from_label_bool_merge@8" }, - "1715": { + "1785": { "block": "remove_operator_from_label_bool_false@3", "stack_in": [ "label_descriptor#0", @@ -9723,10 +9957,10 @@ "cond#0" ] }, - "1716": { + "1786": { "op": "b remove_operator_from_label_bool_merge@4" }, - "1719": { + "1789": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels", "params": { "operator#0": "bytes" @@ -9735,7 +9969,7 @@ "stack_in": [], "op": "proto 1 1" }, - "1722": { + "1792": { "op": "frame_dig -1", "defined_out": [ "operator#0 (copy)" @@ -9744,7 +9978,7 @@ "operator#0 (copy)" ] }, - "1724": { + "1794": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -9755,23 +9989,23 @@ "maybe_exists%0#0" ] }, - "1725": { + "1795": { "op": "bury 1", "stack_out": [ "maybe_exists%0#0" ] }, - "1727": { + "1797": { "op": "bz get_operator_labels_after_if_else@2", "stack_out": [] }, - "1730": { + "1800": { "op": "frame_dig -1", "stack_out": [ "operator#0 (copy)" ] }, - "1732": { + "1802": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -9782,18 +10016,18 @@ "maybe_exists%1#0" ] }, - "1733": { + "1803": { "error": "check self.operators entry exists", "op": "assert // check self.operators entry exists", "stack_out": [ "maybe_value%1#0" ] }, - "1734": { + "1804": { "retsub": true, "op": "retsub" }, - "1735": { + "1805": { "block": "get_operator_labels_after_if_else@2", "stack_in": [], "op": "bytec_2 // 0x0000", @@ -9804,11 +10038,11 @@ "0x0000" ] }, - "1736": { + "1806": { "retsub": true, "op": "retsub" }, - "1737": { + "1807": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset", "params": { "label#0": "bytes", @@ -9818,20 +10052,20 @@ "stack_in": [], "op": "proto 2 0" }, - "1740": { + "1810": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%1#1" ] }, - "1741": { + "1811": { "op": "dup", "stack_out": [ "maybe_value%1#1", "tmp%1#0" ] }, - "1742": { + "1812": { "op": "bytec_3 // \"\"", "stack_out": [ "maybe_value%1#1", @@ -9839,7 +10073,7 @@ "array_length%0#0" ] }, - "1743": { + "1813": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -9848,7 +10082,7 @@ "idx#0" ] }, - "1744": { + "1814": { "op": "frame_dig -2", "defined_out": [ "label#0 (copy)" @@ -9861,7 +10095,7 @@ "label#0 (copy)" ] }, - "1746": { + "1816": { "op": "box_len", "defined_out": [ "cond#0", @@ -9876,7 +10110,7 @@ "cond#0" ] }, - "1747": { + "1817": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -9886,7 +10120,7 @@ "cond#0" ] }, - "1749": { + "1819": { "op": "bnz add_label_to_asset_after_if_else@19", "stack_out": [ "maybe_value%1#1", @@ -9895,7 +10129,7 @@ "idx#0" ] }, - "1752": { + "1822": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -9908,7 +10142,7 @@ "\"ERR:NOEXIST\"" ] }, - "1753": { + "1823": { "op": "log", "stack_out": [ "maybe_value%1#1", @@ -9917,10 +10151,10 @@ "idx#0" ] }, - "1754": { + "1824": { "op": "err" }, - "1755": { + "1825": { "block": "add_label_to_asset_after_if_else@19", "stack_in": [ "maybe_value%1#1", @@ -9940,7 +10174,7 @@ "label#0 (copy)" ] }, - "1757": { + "1827": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [ @@ -9950,7 +10184,7 @@ "idx#0" ] }, - "1760": { + "1830": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -9963,7 +10197,7 @@ "asset#0 (copy)" ] }, - "1762": { + "1832": { "op": "itob", "defined_out": [ "tmp%1#0" @@ -9976,7 +10210,7 @@ "tmp%1#0" ] }, - "1763": { + "1833": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -9987,7 +10221,7 @@ "tmp%1#0" ] }, - "1764": { + "1834": { "op": "frame_bury 1", "defined_out": [ "tmp%1#0" @@ -10000,7 +10234,7 @@ "tmp%1#0" ] }, - "1766": { + "1836": { "op": "box_len", "defined_out": [ "maybe_exists%1#0", @@ -10016,7 +10250,7 @@ "maybe_exists%1#0" ] }, - "1767": { + "1837": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -10026,7 +10260,7 @@ "maybe_exists%1#0" ] }, - "1769": { + "1839": { "op": "bz add_label_to_asset_else_body@2", "stack_out": [ "maybe_value%1#1", @@ -10035,7 +10269,7 @@ "idx#0" ] }, - "1772": { + "1842": { "op": "frame_dig 1", "stack_out": [ "maybe_value%1#1", @@ -10045,7 +10279,7 @@ "tmp%1#0" ] }, - "1774": { + "1844": { "op": "box_len", "defined_out": [ "maybe_exists%0#1", @@ -10061,7 +10295,7 @@ "maybe_exists%0#1" ] }, - "1775": { + "1845": { "op": "bury 1", "stack_out": [ "maybe_value%1#1", @@ -10071,7 +10305,7 @@ "maybe_exists%0#1" ] }, - "1777": { + "1847": { "op": "bnz add_label_to_asset_after_if_else@6", "stack_out": [ "maybe_value%1#1", @@ -10080,7 +10314,7 @@ "idx#0" ] }, - "1780": { + "1850": { "op": "intc 5 // 4294967296", "defined_out": [ "tmp%1#0", @@ -10094,7 +10328,7 @@ "tmp%3#0" ] }, - "1782": { + "1852": { "block": "add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12", "stack_in": [ "maybe_value%1#1", @@ -10117,7 +10351,7 @@ "4294967295" ] }, - "1784": { + "1854": { "op": "==", "defined_out": [ "cond#0" @@ -10130,7 +10364,7 @@ "cond#0" ] }, - "1785": { + "1855": { "op": "bnz add_label_to_asset_after_if_else@15", "stack_out": [ "maybe_value%1#1", @@ -10139,7 +10373,7 @@ "idx#0" ] }, - "1788": { + "1858": { "op": "bytec 5 // \"ERR:EXISTS\"", "defined_out": [ "\"ERR:EXISTS\"" @@ -10152,7 +10386,7 @@ "\"ERR:EXISTS\"" ] }, - "1790": { + "1860": { "op": "log", "stack_out": [ "maybe_value%1#1", @@ -10161,10 +10395,10 @@ "idx#0" ] }, - "1791": { + "1861": { "op": "err" }, - "1792": { + "1862": { "block": "add_label_to_asset_after_if_else@15", "stack_in": [ "maybe_value%1#1", @@ -10184,7 +10418,7 @@ "tmp%1#0" ] }, - "1794": { + "1864": { "op": "dup", "defined_out": [ "tmp%1#0", @@ -10199,7 +10433,7 @@ "tmp%1#0 (copy)" ] }, - "1795": { + "1865": { "op": "box_get", "defined_out": [ "existing#0", @@ -10216,7 +10450,7 @@ "maybe_exists%2#0" ] }, - "1796": { + "1866": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -10228,7 +10462,7 @@ "existing#0" ] }, - "1797": { + "1867": { "op": "frame_dig -2", "defined_out": [ "existing#0", @@ -10245,7 +10479,7 @@ "label#0 (copy)" ] }, - "1799": { + "1869": { "op": "len", "defined_out": [ "existing#0", @@ -10262,7 +10496,7 @@ "length%0#0" ] }, - "1800": { + "1870": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -10279,7 +10513,7 @@ "as_bytes%0#0" ] }, - "1801": { + "1871": { "op": "extract 6 2", "defined_out": [ "existing#0", @@ -10296,7 +10530,7 @@ "length_uint16%0#0" ] }, - "1804": { + "1874": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -10309,7 +10543,7 @@ "label#0 (copy)" ] }, - "1806": { + "1876": { "op": "concat", "defined_out": [ "encoded_value%0#0", @@ -10326,7 +10560,7 @@ "encoded_value%0#0" ] }, - "1807": { + "1877": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -10345,7 +10579,7 @@ "1" ] }, - "1808": { + "1878": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -10357,7 +10591,7 @@ "existing#0" ] }, - "1811": { + "1881": { "op": "dig 1", "stack_out": [ "maybe_value%1#1", @@ -10369,7 +10603,7 @@ "tmp%1#0 (copy)" ] }, - "1813": { + "1883": { "op": "box_del", "defined_out": [ "existing#0", @@ -10386,7 +10620,7 @@ "{box_del}" ] }, - "1814": { + "1884": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -10397,7 +10631,7 @@ "existing#0" ] }, - "1815": { + "1885": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -10406,7 +10640,7 @@ "idx#0" ] }, - "1816": { + "1886": { "block": "add_label_to_asset_after_if_else@3", "stack_in": [ "maybe_value%1#1", @@ -10426,7 +10660,7 @@ "label#0 (copy)" ] }, - "1818": { + "1888": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -10441,7 +10675,7 @@ "maybe_exists%3#0" ] }, - "1819": { + "1889": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -10452,7 +10686,7 @@ "label_descriptor#0" ] }, - "1820": { + "1890": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -10467,7 +10701,7 @@ "label_descriptor#0 (copy)" ] }, - "1821": { + "1891": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -10484,7 +10718,7 @@ "2" ] }, - "1822": { + "1892": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -10499,7 +10733,7 @@ "tmp%13#0" ] }, - "1823": { + "1893": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -10516,7 +10750,7 @@ "1" ] }, - "1824": { + "1894": { "op": "+", "defined_out": [ "label_descriptor#0", @@ -10531,7 +10765,7 @@ "to_encode%0#0" ] }, - "1825": { + "1895": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -10546,7 +10780,7 @@ "val_as_bytes%0#0" ] }, - "1826": { + "1896": { "op": "replace2 2", "stack_out": [ "maybe_value%1#1", @@ -10556,7 +10790,7 @@ "label_descriptor#0" ] }, - "1828": { + "1898": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -10567,7 +10801,7 @@ "label#0 (copy)" ] }, - "1830": { + "1900": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -10582,7 +10816,7 @@ "{box_del}" ] }, - "1831": { + "1901": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -10592,7 +10826,7 @@ "label_descriptor#0" ] }, - "1832": { + "1902": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -10603,7 +10837,7 @@ "label#0 (copy)" ] }, - "1834": { + "1904": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -10614,7 +10848,7 @@ "label_descriptor#0" ] }, - "1835": { + "1905": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -10623,11 +10857,11 @@ "idx#0" ] }, - "1836": { + "1906": { "retsub": true, "op": "retsub" }, - "1837": { + "1907": { "block": "add_label_to_asset_after_if_else@6", "stack_in": [ "maybe_value%1#1", @@ -10647,7 +10881,7 @@ "tmp%1#0" ] }, - "1839": { + "1909": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -10663,7 +10897,7 @@ "maybe_exists%1#0" ] }, - "1840": { + "1910": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -10674,7 +10908,7 @@ "maybe_value%1#1" ] }, - "1841": { + "1911": { "op": "dup", "stack_out": [ "maybe_value%1#1", @@ -10686,7 +10920,7 @@ "maybe_value%1#1 (copy)" ] }, - "1842": { + "1912": { "op": "cover 2", "stack_out": [ "maybe_value%1#1", @@ -10698,7 +10932,7 @@ "maybe_value%1#1" ] }, - "1844": { + "1914": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%1#0", @@ -10714,7 +10948,7 @@ "maybe_exists%1#0" ] }, - "1846": { + "1916": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -10725,7 +10959,7 @@ "maybe_value%1#1" ] }, - "1847": { + "1917": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -10741,7 +10975,7 @@ "0" ] }, - "1848": { + "1918": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -10756,7 +10990,7 @@ "array_length%0#0" ] }, - "1849": { + "1919": { "op": "frame_bury 2", "defined_out": [ "array_length%0#0", @@ -10770,7 +11004,7 @@ "idx#0" ] }, - "1851": { + "1921": { "op": "intc_1 // 0", "defined_out": [ "array_length%0#0", @@ -10786,7 +11020,7 @@ "idx#0" ] }, - "1852": { + "1922": { "op": "frame_bury 3", "defined_out": [ "array_length%0#0", @@ -10801,7 +11035,7 @@ "idx#0" ] }, - "1854": { + "1924": { "block": "add_label_to_asset_for_header@7", "stack_in": [ "maybe_value%1#1", @@ -10821,7 +11055,7 @@ "idx#0" ] }, - "1856": { + "1926": { "op": "frame_dig 2", "defined_out": [ "array_length%0#0", @@ -10836,7 +11070,7 @@ "array_length%0#0" ] }, - "1858": { + "1928": { "op": "<", "defined_out": [ "array_length%0#0", @@ -10851,7 +11085,7 @@ "continue_looping%0#0" ] }, - "1859": { + "1929": { "op": "bz add_label_to_asset_after_for@11", "stack_out": [ "maybe_value%1#1", @@ -10860,7 +11094,7 @@ "idx#0" ] }, - "1862": { + "1932": { "op": "frame_dig 0", "defined_out": [ "array_length%0#0", @@ -10875,7 +11109,7 @@ "maybe_value%1#1" ] }, - "1864": { + "1934": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -10891,7 +11125,7 @@ "array_head_and_tail%0#0" ] }, - "1867": { + "1937": { "op": "frame_dig 3", "stack_out": [ "maybe_value%1#1", @@ -10902,7 +11136,7 @@ "idx#0" ] }, - "1869": { + "1939": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -10921,7 +11155,7 @@ "2" ] }, - "1870": { + "1940": { "op": "*", "defined_out": [ "array_head_and_tail%0#0", @@ -10939,7 +11173,7 @@ "item_offset_offset%0#0" ] }, - "1871": { + "1941": { "op": "dig 1", "defined_out": [ "array_head_and_tail%0#0", @@ -10959,7 +11193,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1873": { + "1943": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -10971,7 +11205,7 @@ "item_offset_offset%0#0" ] }, - "1874": { + "1944": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -10989,7 +11223,7 @@ "item_offset%0#0" ] }, - "1875": { + "1945": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -11011,7 +11245,7 @@ "item_offset%0#0 (copy)" ] }, - "1876": { + "1946": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -11031,7 +11265,7 @@ "item_length%0#0" ] }, - "1877": { + "1947": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%1#1", @@ -11044,7 +11278,7 @@ "2" ] }, - "1878": { + "1948": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -11064,7 +11298,7 @@ "item_head_tail_length%0#0" ] }, - "1879": { + "1949": { "op": "extract3", "defined_out": [ "array_length%0#0", @@ -11080,7 +11314,7 @@ "stored_label#0" ] }, - "1880": { + "1950": { "op": "extract 2 0", "defined_out": [ "array_length%0#0", @@ -11096,7 +11330,7 @@ "tmp%4#1" ] }, - "1883": { + "1953": { "op": "frame_dig -2", "defined_out": [ "array_length%0#0", @@ -11114,7 +11348,7 @@ "label#0 (copy)" ] }, - "1885": { + "1955": { "op": "==", "defined_out": [ "array_length%0#0", @@ -11130,7 +11364,7 @@ "tmp%5#1" ] }, - "1886": { + "1956": { "op": "bz add_label_to_asset_after_if_else@10", "stack_out": [ "maybe_value%1#1", @@ -11139,7 +11373,7 @@ "idx#0" ] }, - "1889": { + "1959": { "op": "frame_dig 3", "defined_out": [ "array_length%0#0", @@ -11155,10 +11389,10 @@ "tmp%3#0" ] }, - "1891": { + "1961": { "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" }, - "1894": { + "1964": { "block": "add_label_to_asset_after_if_else@10", "stack_in": [ "maybe_value%1#1", @@ -11178,7 +11412,7 @@ "idx#0" ] }, - "1896": { + "1966": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -11193,7 +11427,7 @@ "1" ] }, - "1897": { + "1967": { "op": "+", "stack_out": [ "maybe_value%1#1", @@ -11203,7 +11437,7 @@ "idx#0" ] }, - "1898": { + "1968": { "op": "frame_bury 3", "defined_out": [ "idx#0" @@ -11215,10 +11449,10 @@ "idx#0" ] }, - "1900": { + "1970": { "op": "b add_label_to_asset_for_header@7" }, - "1903": { + "1973": { "block": "add_label_to_asset_after_for@11", "stack_in": [ "maybe_value%1#1", @@ -11238,10 +11472,10 @@ "tmp%3#0" ] }, - "1905": { + "1975": { "op": "b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12" }, - "1908": { + "1978": { "block": "add_label_to_asset_else_body@2", "stack_in": [ "maybe_value%1#1", @@ -11261,7 +11495,7 @@ "label#0 (copy)" ] }, - "1910": { + "1980": { "op": "len", "defined_out": [ "length%1#0" @@ -11274,7 +11508,7 @@ "length%1#0" ] }, - "1911": { + "1981": { "op": "itob", "defined_out": [ "as_bytes%1#0" @@ -11287,7 +11521,7 @@ "as_bytes%1#0" ] }, - "1912": { + "1982": { "op": "extract 6 2", "defined_out": [ "length_uint16%1#0" @@ -11300,7 +11534,7 @@ "length_uint16%1#0" ] }, - "1915": { + "1985": { "op": "frame_dig -2", "stack_out": [ "maybe_value%1#1", @@ -11311,7 +11545,7 @@ "label#0 (copy)" ] }, - "1917": { + "1987": { "op": "concat", "defined_out": [ "encoded_value%1#0" @@ -11324,7 +11558,7 @@ "encoded_value%1#0" ] }, - "1918": { + "1988": { "op": "bytec 6 // 0x0002", "defined_out": [ "0x0002", @@ -11339,7 +11573,7 @@ "0x0002" ] }, - "1920": { + "1990": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -11350,7 +11584,7 @@ "encoded_value%1#0" ] }, - "1921": { + "1991": { "op": "concat", "defined_out": [ "result%1#0" @@ -11363,8 +11597,8 @@ "result%1#0" ] }, - "1922": { - "op": "bytec 11 // 0x0001", + "1992": { + "op": "bytec 10 // 0x0001", "defined_out": [ "0x0001", "result%1#0" @@ -11378,7 +11612,7 @@ "0x0001" ] }, - "1924": { + "1994": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -11389,7 +11623,7 @@ "result%1#0" ] }, - "1925": { + "1995": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -11402,7 +11636,7 @@ "array_data%0#0" ] }, - "1926": { + "1996": { "op": "frame_dig 1", "defined_out": [ "array_data%0#0", @@ -11417,7 +11651,7 @@ "tmp%1#0" ] }, - "1928": { + "1998": { "op": "dup", "defined_out": [ "array_data%0#0", @@ -11434,7 +11668,7 @@ "tmp%1#0 (copy)" ] }, - "1929": { + "1999": { "op": "box_del", "defined_out": [ "array_data%0#0", @@ -11451,7 +11685,7 @@ "{box_del}" ] }, - "1930": { + "2000": { "op": "pop", "stack_out": [ "maybe_value%1#1", @@ -11462,7 +11696,7 @@ "tmp%1#0" ] }, - "1931": { + "2001": { "op": "swap", "stack_out": [ "maybe_value%1#1", @@ -11473,7 +11707,7 @@ "array_data%0#0" ] }, - "1932": { + "2002": { "op": "box_put", "stack_out": [ "maybe_value%1#1", @@ -11482,10 +11716,10 @@ "idx#0" ] }, - "1933": { + "2003": { "op": "b add_label_to_asset_after_if_else@3" }, - "1936": { + "2006": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset", "params": { "label#0": "bytes", @@ -11495,13 +11729,13 @@ "stack_in": [], "op": "proto 2 0" }, - "1939": { + "2009": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0" ] }, - "1940": { + "2010": { "op": "dupn 3", "stack_out": [ "maybe_value%3#0", @@ -11510,7 +11744,7 @@ "tmp%1#0" ] }, - "1942": { + "2012": { "op": "bytec_3 // \"\"", "stack_out": [ "maybe_value%3#0", @@ -11520,7 +11754,7 @@ "array_length%1#0" ] }, - "1943": { + "2013": { "op": "dupn 2", "stack_out": [ "maybe_value%3#0", @@ -11532,7 +11766,7 @@ "idx#0" ] }, - "1945": { + "2015": { "op": "frame_dig -2", "defined_out": [ "label#0 (copy)" @@ -11548,7 +11782,7 @@ "label#0 (copy)" ] }, - "1947": { + "2017": { "op": "box_len", "defined_out": [ "cond#1", @@ -11566,7 +11800,7 @@ "cond#1" ] }, - "1948": { + "2018": { "op": "bury 1", "stack_out": [ "maybe_value%3#0", @@ -11579,7 +11813,7 @@ "cond#1" ] }, - "1950": { + "2020": { "op": "bnz remove_label_from_asset_after_if_else@20", "stack_out": [ "maybe_value%3#0", @@ -11591,7 +11825,7 @@ "idx#0" ] }, - "1953": { + "2023": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"" @@ -11607,7 +11841,7 @@ "\"ERR:NOEXIST\"" ] }, - "1954": { + "2024": { "op": "log", "stack_out": [ "maybe_value%3#0", @@ -11619,10 +11853,10 @@ "idx#0" ] }, - "1955": { + "2025": { "op": "err" }, - "1956": { + "2026": { "block": "remove_label_from_asset_after_if_else@20", "stack_in": [ "maybe_value%3#0", @@ -11648,7 +11882,7 @@ "label#0 (copy)" ] }, - "1958": { + "2028": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling.operator_only", "op": "callsub operator_only", "stack_out": [ @@ -11661,7 +11895,7 @@ "idx#0" ] }, - "1961": { + "2031": { "op": "intc_1 // 0", "defined_out": [ "found#0" @@ -11677,7 +11911,7 @@ "found#0" ] }, - "1962": { + "2032": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -11692,7 +11926,7 @@ "idx#0" ] }, - "1964": { + "2034": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)", @@ -11709,7 +11943,7 @@ "asset#0 (copy)" ] }, - "1966": { + "2036": { "op": "itob", "defined_out": [ "found#0", @@ -11726,7 +11960,7 @@ "tmp%1#0" ] }, - "1967": { + "2037": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -11740,7 +11974,7 @@ "tmp%1#0" ] }, - "1968": { + "2038": { "op": "frame_bury 3", "defined_out": [ "found#0", @@ -11757,7 +11991,7 @@ "tmp%1#0" ] }, - "1970": { + "2040": { "op": "box_get", "defined_out": [ "found#0", @@ -11777,7 +12011,7 @@ "maybe_exists%1#0" ] }, - "1971": { + "2041": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -11791,7 +12025,7 @@ "maybe_value%1#0" ] }, - "1972": { + "2042": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -11805,7 +12039,7 @@ "0" ] }, - "1973": { + "2043": { "op": "extract_uint16", "defined_out": [ "found#0", @@ -11823,7 +12057,7 @@ "tmp%3#0" ] }, - "1974": { + "2044": { "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", @@ -11837,7 +12071,7 @@ "1" ] }, - "1975": { + "2045": { "op": "==", "defined_out": [ "found#0", @@ -11855,7 +12089,7 @@ "tmp%4#0" ] }, - "1976": { + "2046": { "op": "bz remove_label_from_asset_else_body@5", "stack_out": [ "maybe_value%3#0", @@ -11867,7 +12101,7 @@ "idx#0" ] }, - "1979": { + "2049": { "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", @@ -11880,7 +12114,7 @@ "tmp%1#0" ] }, - "1981": { + "2051": { "op": "box_get", "defined_out": [ "found#0", @@ -11900,7 +12134,7 @@ "maybe_exists%2#0" ] }, - "1982": { + "2052": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -11914,7 +12148,7 @@ "maybe_value%2#0" ] }, - "1983": { + "2053": { "op": "dup", "defined_out": [ "found#0", @@ -11934,7 +12168,7 @@ "maybe_value%2#0 (copy)" ] }, - "1984": { + "2054": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%0#0", @@ -11954,7 +12188,7 @@ "array_head_and_tail%0#0" ] }, - "1987": { + "2057": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -11968,7 +12202,7 @@ "maybe_value%2#0" ] }, - "1988": { + "2058": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -11983,7 +12217,7 @@ "0" ] }, - "1989": { + "2059": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -12003,7 +12237,7 @@ "array_length%0#0" ] }, - "1990": { + "2060": { "error": "Index access is out of bounds", "op": "assert // Index access is out of bounds", "stack_out": [ @@ -12017,7 +12251,7 @@ "array_head_and_tail%0#0" ] }, - "1991": { + "2061": { "op": "dup", "defined_out": [ "array_head_and_tail%0#0", @@ -12037,7 +12271,7 @@ "array_head_and_tail%0#0 (copy)" ] }, - "1992": { + "2062": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -12052,7 +12286,7 @@ "0" ] }, - "1993": { + "2063": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -12072,7 +12306,7 @@ "item_offset%0#0" ] }, - "1994": { + "2064": { "op": "dup2", "defined_out": [ "array_head_and_tail%0#0", @@ -12096,7 +12330,7 @@ "item_offset%0#0 (copy)" ] }, - "1995": { + "2065": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%0#0", @@ -12118,7 +12352,7 @@ "item_length%0#0" ] }, - "1996": { + "2066": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -12142,7 +12376,7 @@ "2" ] }, - "1997": { + "2067": { "op": "+", "defined_out": [ "array_head_and_tail%0#0", @@ -12164,7 +12398,7 @@ "item_head_tail_length%0#0" ] }, - "1998": { + "2068": { "op": "extract3", "defined_out": [ "found#0", @@ -12182,7 +12416,7 @@ "tmp%7#0" ] }, - "1999": { + "2069": { "op": "extract 2 0", "defined_out": [ "found#0", @@ -12200,7 +12434,7 @@ "tmp%8#0" ] }, - "2002": { + "2072": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -12214,7 +12448,7 @@ "label#0 (copy)" ] }, - "2004": { + "2074": { "op": "==", "defined_out": [ "found#0", @@ -12232,7 +12466,7 @@ "tmp%9#0" ] }, - "2005": { + "2075": { "op": "bz remove_label_from_asset_else_body@3", "stack_out": [ "maybe_value%3#0", @@ -12244,7 +12478,7 @@ "idx#0" ] }, - "2008": { + "2078": { "op": "frame_dig 3", "stack_out": [ "maybe_value%3#0", @@ -12257,7 +12491,7 @@ "tmp%1#0" ] }, - "2010": { + "2080": { "op": "box_del", "defined_out": [ "found#0", @@ -12275,7 +12509,7 @@ "{box_del}" ] }, - "2011": { + "2081": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -12287,7 +12521,7 @@ "idx#0" ] }, - "2012": { + "2082": { "op": "intc_0 // 1", "stack_out": [ "maybe_value%3#0", @@ -12300,7 +12534,7 @@ "found#0" ] }, - "2013": { + "2083": { "op": "frame_bury 5", "stack_out": [ "maybe_value%3#0", @@ -12312,7 +12546,7 @@ "idx#0" ] }, - "2015": { + "2085": { "block": "remove_label_from_asset_after_if_else@13", "stack_in": [ "maybe_value%3#0", @@ -12338,7 +12572,7 @@ "found#0" ] }, - "2017": { + "2087": { "op": "bnz remove_label_from_asset_after_if_else@16", "stack_out": [ "maybe_value%3#0", @@ -12350,7 +12584,7 @@ "idx#0" ] }, - "2020": { + "2090": { "op": "bytec_1 // \"ERR:NOEXIST\"", "defined_out": [ "\"ERR:NOEXIST\"", @@ -12367,7 +12601,7 @@ "\"ERR:NOEXIST\"" ] }, - "2021": { + "2091": { "op": "log", "stack_out": [ "maybe_value%3#0", @@ -12379,10 +12613,10 @@ "idx#0" ] }, - "2022": { + "2092": { "op": "err" }, - "2023": { + "2093": { "block": "remove_label_from_asset_after_if_else@16", "stack_in": [ "maybe_value%3#0", @@ -12408,7 +12642,7 @@ "label#0 (copy)" ] }, - "2025": { + "2095": { "op": "box_get", "defined_out": [ "label_descriptor#0", @@ -12426,7 +12660,7 @@ "maybe_exists%4#0" ] }, - "2026": { + "2096": { "error": "check self.labels entry exists", "op": "assert // check self.labels entry exists", "stack_out": [ @@ -12440,7 +12674,7 @@ "label_descriptor#0" ] }, - "2027": { + "2097": { "op": "dup", "defined_out": [ "label_descriptor#0", @@ -12458,7 +12692,7 @@ "label_descriptor#0 (copy)" ] }, - "2028": { + "2098": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -12478,7 +12712,7 @@ "2" ] }, - "2029": { + "2099": { "op": "extract_uint64", "defined_out": [ "label_descriptor#0", @@ -12496,7 +12730,7 @@ "tmp%20#0" ] }, - "2030": { + "2100": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -12516,7 +12750,7 @@ "1" ] }, - "2031": { + "2101": { "op": "-", "defined_out": [ "label_descriptor#0", @@ -12534,7 +12768,7 @@ "to_encode%0#0" ] }, - "2032": { + "2102": { "op": "itob", "defined_out": [ "label_descriptor#0", @@ -12552,7 +12786,7 @@ "val_as_bytes%0#0" ] }, - "2033": { + "2103": { "op": "replace2 2", "stack_out": [ "maybe_value%3#0", @@ -12565,7 +12799,7 @@ "label_descriptor#0" ] }, - "2035": { + "2105": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -12579,7 +12813,7 @@ "label#0 (copy)" ] }, - "2037": { + "2107": { "op": "box_del", "defined_out": [ "label_descriptor#0", @@ -12597,7 +12831,7 @@ "{box_del}" ] }, - "2038": { + "2108": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -12610,7 +12844,7 @@ "label_descriptor#0" ] }, - "2039": { + "2109": { "op": "frame_dig -2", "stack_out": [ "maybe_value%3#0", @@ -12624,7 +12858,7 @@ "label#0 (copy)" ] }, - "2041": { + "2111": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -12638,7 +12872,7 @@ "label_descriptor#0" ] }, - "2042": { + "2112": { "op": "box_put", "stack_out": [ "maybe_value%3#0", @@ -12650,11 +12884,11 @@ "idx#0" ] }, - "2043": { + "2113": { "retsub": true, "op": "retsub" }, - "2044": { + "2114": { "block": "remove_label_from_asset_else_body@3", "stack_in": [ "maybe_value%3#0", @@ -12680,7 +12914,7 @@ "found#0" ] }, - "2045": { + "2115": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -12695,10 +12929,10 @@ "idx#0" ] }, - "2047": { + "2117": { "op": "b remove_label_from_asset_after_if_else@13" }, - "2050": { + "2120": { "block": "remove_label_from_asset_else_body@5", "stack_in": [ "maybe_value%3#0", @@ -12724,7 +12958,7 @@ "next_list#0" ] }, - "2051": { + "2121": { "op": "frame_bury 1", "defined_out": [ "next_list#0" @@ -12739,7 +12973,7 @@ "idx#0" ] }, - "2053": { + "2123": { "op": "frame_dig 3", "defined_out": [ "next_list#0", @@ -12756,7 +12990,7 @@ "tmp%1#0" ] }, - "2055": { + "2125": { "op": "box_get", "defined_out": [ "maybe_exists%3#0", @@ -12776,7 +13010,7 @@ "maybe_exists%3#0" ] }, - "2056": { + "2126": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -12790,7 +13024,7 @@ "maybe_value%3#0" ] }, - "2057": { + "2127": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -12805,7 +13039,7 @@ "maybe_value%3#0 (copy)" ] }, - "2058": { + "2128": { "op": "cover 2", "stack_out": [ "maybe_value%3#0", @@ -12820,7 +13054,7 @@ "maybe_value%3#0" ] }, - "2060": { + "2130": { "op": "frame_bury 0", "defined_out": [ "maybe_exists%3#0", @@ -12840,7 +13074,7 @@ "maybe_exists%3#0" ] }, - "2062": { + "2132": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -12854,7 +13088,7 @@ "maybe_value%3#0" ] }, - "2063": { + "2133": { "op": "intc_1 // 0", "stack_out": [ "maybe_value%3#0", @@ -12868,7 +13102,7 @@ "0" ] }, - "2064": { + "2134": { "op": "extract_uint16", "defined_out": [ "array_length%1#0", @@ -12887,7 +13121,7 @@ "array_length%1#0" ] }, - "2065": { + "2135": { "op": "frame_bury 4", "defined_out": [ "array_length%1#0", @@ -12905,7 +13139,7 @@ "idx#0" ] }, - "2067": { + "2137": { "op": "intc_1 // 0", "defined_out": [ "array_length%1#0", @@ -12925,7 +13159,7 @@ "idx#0" ] }, - "2068": { + "2138": { "op": "frame_bury 6", "defined_out": [ "array_length%1#0", @@ -12944,7 +13178,7 @@ "idx#0" ] }, - "2070": { + "2140": { "block": "remove_label_from_asset_for_header@6", "stack_in": [ "maybe_value%3#0", @@ -12970,7 +13204,7 @@ "idx#0" ] }, - "2072": { + "2142": { "op": "frame_dig 4", "defined_out": [ "array_length%1#0", @@ -12988,7 +13222,7 @@ "array_length%1#0" ] }, - "2074": { + "2144": { "op": "<", "defined_out": [ "array_length%1#0", @@ -13006,7 +13240,7 @@ "continue_looping%0#0" ] }, - "2075": { + "2145": { "op": "bz remove_label_from_asset_after_for@12", "stack_out": [ "maybe_value%3#0", @@ -13018,7 +13252,7 @@ "idx#0" ] }, - "2078": { + "2148": { "op": "frame_dig 0", "defined_out": [ "array_length%1#0", @@ -13036,7 +13270,7 @@ "maybe_value%3#0" ] }, - "2080": { + "2150": { "op": "extract 2 0", "defined_out": [ "array_head_and_tail%1#0", @@ -13055,7 +13289,7 @@ "array_head_and_tail%1#0" ] }, - "2083": { + "2153": { "op": "frame_dig 6", "stack_out": [ "maybe_value%3#0", @@ -13069,7 +13303,7 @@ "idx#0" ] }, - "2085": { + "2155": { "op": "intc_2 // 2", "defined_out": [ "2", @@ -13091,7 +13325,7 @@ "2" ] }, - "2086": { + "2156": { "op": "*", "defined_out": [ "array_head_and_tail%1#0", @@ -13112,7 +13346,7 @@ "item_offset_offset%1#0" ] }, - "2087": { + "2157": { "op": "dig 1", "defined_out": [ "array_head_and_tail%1#0", @@ -13135,7 +13369,7 @@ "array_head_and_tail%1#0 (copy)" ] }, - "2089": { + "2159": { "op": "swap", "stack_out": [ "maybe_value%3#0", @@ -13150,7 +13384,7 @@ "item_offset_offset%1#0" ] }, - "2090": { + "2160": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%1#0", @@ -13171,7 +13405,7 @@ "item_offset%1#0" ] }, - "2091": { + "2161": { "op": "dup2", "defined_out": [ "array_head_and_tail%1#0", @@ -13196,7 +13430,7 @@ "item_offset%1#0 (copy)" ] }, - "2092": { + "2162": { "op": "extract_uint16", "defined_out": [ "array_head_and_tail%1#0", @@ -13219,7 +13453,7 @@ "item_length%1#0" ] }, - "2093": { + "2163": { "op": "intc_2 // 2", "stack_out": [ "maybe_value%3#0", @@ -13235,7 +13469,7 @@ "2" ] }, - "2094": { + "2164": { "op": "+", "defined_out": [ "array_head_and_tail%1#0", @@ -13258,7 +13492,7 @@ "item_head_tail_length%1#0" ] }, - "2095": { + "2165": { "op": "extract3", "defined_out": [ "array_length%1#0", @@ -13277,7 +13511,7 @@ "stored_label#0" ] }, - "2096": { + "2166": { "op": "dup", "stack_out": [ "maybe_value%3#0", @@ -13291,7 +13525,7 @@ "stored_label#0" ] }, - "2097": { + "2167": { "op": "frame_bury 2", "defined_out": [ "array_length%1#0", @@ -13310,7 +13544,7 @@ "stored_label#0" ] }, - "2099": { + "2169": { "op": "extract 2 0", "defined_out": [ "array_length%1#0", @@ -13330,7 +13564,7 @@ "tmp%14#0" ] }, - "2102": { + "2172": { "op": "frame_dig -2", "defined_out": [ "array_length%1#0", @@ -13352,7 +13586,7 @@ "label#0 (copy)" ] }, - "2104": { + "2174": { "op": "!=", "defined_out": [ "array_length%1#0", @@ -13372,7 +13606,7 @@ "tmp%15#0" ] }, - "2105": { + "2175": { "op": "bz remove_label_from_asset_else_body@9", "stack_out": [ "maybe_value%3#0", @@ -13384,7 +13618,7 @@ "idx#0" ] }, - "2108": { + "2178": { "op": "frame_dig 1", "defined_out": [ "array_length%1#0", @@ -13404,7 +13638,7 @@ "next_list#0" ] }, - "2110": { + "2180": { "op": "frame_dig 2", "stack_out": [ "maybe_value%3#0", @@ -13418,7 +13652,7 @@ "stored_label#0" ] }, - "2112": { + "2182": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -13441,7 +13675,7 @@ "1" ] }, - "2113": { + "2183": { "callsub": "_puya_lib.arc4.dynamic_array_concat_byte_length_head", "op": "callsub dynamic_array_concat_byte_length_head", "stack_out": [ @@ -13455,7 +13689,7 @@ "next_list#0" ] }, - "2116": { + "2186": { "op": "frame_bury 1", "defined_out": [ "array_length%1#0", @@ -13474,7 +13708,7 @@ "idx#0" ] }, - "2118": { + "2188": { "block": "remove_label_from_asset_after_if_else@10", "stack_in": [ "maybe_value%3#0", @@ -13500,7 +13734,7 @@ "idx#0" ] }, - "2120": { + "2190": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -13518,7 +13752,7 @@ "1" ] }, - "2121": { + "2191": { "op": "+", "stack_out": [ "maybe_value%3#0", @@ -13531,7 +13765,7 @@ "idx#0" ] }, - "2122": { + "2192": { "op": "frame_bury 6", "defined_out": [ "idx#0" @@ -13546,10 +13780,10 @@ "idx#0" ] }, - "2124": { + "2194": { "op": "b remove_label_from_asset_for_header@6" }, - "2127": { + "2197": { "block": "remove_label_from_asset_else_body@9", "stack_in": [ "maybe_value%3#0", @@ -13575,7 +13809,7 @@ "found#0" ] }, - "2128": { + "2198": { "op": "frame_bury 5", "defined_out": [ "found#0" @@ -13590,10 +13824,10 @@ "idx#0" ] }, - "2130": { + "2200": { "op": "b remove_label_from_asset_after_if_else@10" }, - "2133": { + "2203": { "block": "remove_label_from_asset_after_for@12", "stack_in": [ "maybe_value%3#0", @@ -13619,7 +13853,7 @@ "tmp%1#0" ] }, - "2135": { + "2205": { "op": "dup", "defined_out": [ "tmp%1#0", @@ -13637,7 +13871,7 @@ "tmp%1#0 (copy)" ] }, - "2136": { + "2206": { "op": "box_del", "defined_out": [ "tmp%1#0", @@ -13655,7 +13889,7 @@ "{box_del}" ] }, - "2137": { + "2207": { "op": "pop", "stack_out": [ "maybe_value%3#0", @@ -13668,7 +13902,7 @@ "tmp%1#0" ] }, - "2138": { + "2208": { "op": "frame_dig 1", "defined_out": [ "next_list#0", @@ -13686,7 +13920,7 @@ "next_list#0" ] }, - "2140": { + "2210": { "op": "box_put", "stack_out": [ "maybe_value%3#0", @@ -13698,10 +13932,10 @@ "idx#0" ] }, - "2141": { + "2211": { "op": "b remove_label_from_asset_after_if_else@13" }, - "2144": { + "2214": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels", "params": { "asset#0": "uint64" @@ -13710,7 +13944,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2147": { + "2217": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -13719,7 +13953,7 @@ "asset#0 (copy)" ] }, - "2149": { + "2219": { "op": "itob", "defined_out": [ "tmp%0#0" @@ -13728,7 +13962,7 @@ "tmp%0#0" ] }, - "2150": { + "2220": { "op": "dup", "defined_out": [ "tmp%0#0" @@ -13738,7 +13972,7 @@ "tmp%0#0" ] }, - "2151": { + "2221": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -13751,27 +13985,27 @@ "maybe_exists%0#0" ] }, - "2152": { + "2222": { "op": "bury 1", "stack_out": [ "tmp%0#0", "maybe_exists%0#0" ] }, - "2154": { + "2224": { "op": "bz get_asset_labels_after_if_else@2", "stack_out": [ "tmp%0#0" ] }, - "2157": { + "2227": { "op": "frame_dig 0", "stack_out": [ "tmp%0#0", "tmp%0#0" ] }, - "2159": { + "2229": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -13784,7 +14018,7 @@ "maybe_exists%1#0" ] }, - "2160": { + "2230": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -13792,14 +14026,14 @@ "maybe_value%1#0" ] }, - "2161": { + "2231": { "op": "swap" }, - "2162": { + "2232": { "retsub": true, "op": "retsub" }, - "2163": { + "2233": { "block": "get_asset_labels_after_if_else@2", "stack_in": [ "tmp%0#0" @@ -13813,14 +14047,14 @@ "0x0000" ] }, - "2164": { + "2234": { "op": "swap" }, - "2165": { + "2235": { "retsub": true, "op": "retsub" }, - "2166": { + "2236": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels", "params": { "assets#0": "bytes" @@ -13829,19 +14063,19 @@ "stack_in": [], "op": "proto 1 1" }, - "2169": { + "2239": { "op": "intc_1 // 0", "stack_out": [ "tmp%0#0" ] }, - "2170": { + "2240": { "op": "bytec_2 // 0x0000" }, - "2171": { + "2241": { "op": "frame_dig -1" }, - "2173": { + "2243": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -13855,7 +14089,7 @@ "0" ] }, - "2174": { + "2244": { "op": "extract_uint16", "defined_out": [ "array_length%0#0", @@ -13867,7 +14101,7 @@ "array_length%0#0" ] }, - "2175": { + "2245": { "op": "intc_1 // 0", "defined_out": [ "_i#0", @@ -13881,7 +14115,7 @@ "_i#0" ] }, - "2176": { + "2246": { "block": "get_assets_labels_for_header@1", "stack_in": [ "tmp%0#0", @@ -13901,7 +14135,7 @@ "_i#0" ] }, - "2178": { + "2248": { "op": "frame_dig 2", "defined_out": [ "_i#0", @@ -13916,7 +14150,7 @@ "array_length%0#0" ] }, - "2180": { + "2250": { "op": "<", "defined_out": [ "_i#0", @@ -13931,7 +14165,7 @@ "continue_looping%0#0" ] }, - "2181": { + "2251": { "op": "bz get_assets_labels_after_for@7", "stack_out": [ "tmp%0#0", @@ -13940,7 +14174,7 @@ "_i#0" ] }, - "2184": { + "2254": { "op": "frame_dig -1", "defined_out": [ "_i#0", @@ -13955,7 +14189,7 @@ "assets#0 (copy)" ] }, - "2186": { + "2256": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -13970,7 +14204,7 @@ "array_head_and_tail%0#0" ] }, - "2189": { + "2259": { "op": "frame_dig 3", "stack_out": [ "tmp%0#0", @@ -13981,7 +14215,7 @@ "_i#0" ] }, - "2191": { + "2261": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -13999,7 +14233,7 @@ "8" ] }, - "2192": { + "2262": { "op": "*", "defined_out": [ "_i#0", @@ -14016,7 +14250,7 @@ "item_offset%0#0" ] }, - "2193": { + "2263": { "op": "extract_uint64", "defined_out": [ "_i#0", @@ -14031,7 +14265,7 @@ "asset#0" ] }, - "2194": { + "2264": { "op": "itob", "defined_out": [ "_i#0", @@ -14046,7 +14280,7 @@ "tmp%0#0" ] }, - "2195": { + "2265": { "op": "dup", "stack_out": [ "tmp%0#0", @@ -14057,7 +14291,7 @@ "tmp%0#0" ] }, - "2196": { + "2266": { "op": "frame_bury 0", "defined_out": [ "_i#0", @@ -14072,7 +14306,7 @@ "tmp%0#0" ] }, - "2198": { + "2268": { "op": "box_len", "defined_out": [ "_i#0", @@ -14090,7 +14324,7 @@ "maybe_exists%0#0" ] }, - "2199": { + "2269": { "op": "bury 1", "stack_out": [ "tmp%0#0", @@ -14100,7 +14334,7 @@ "maybe_exists%0#0" ] }, - "2201": { + "2271": { "op": "bz get_assets_labels_else_body@4", "stack_out": [ "tmp%0#0", @@ -14109,7 +14343,7 @@ "_i#0" ] }, - "2204": { + "2274": { "op": "frame_dig 0", "stack_out": [ "tmp%0#0", @@ -14119,7 +14353,7 @@ "tmp%0#0" ] }, - "2206": { + "2276": { "op": "box_get", "defined_out": [ "_i#0", @@ -14137,7 +14371,7 @@ "maybe_exists%1#0" ] }, - "2207": { + "2277": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "stack_out": [ @@ -14148,7 +14382,7 @@ "maybe_value%1#0" ] }, - "2208": { + "2278": { "op": "bytec 6 // 0x0002", "defined_out": [ "0x0002", @@ -14166,7 +14400,7 @@ "0x0002" ] }, - "2210": { + "2280": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -14177,7 +14411,7 @@ "maybe_value%1#0" ] }, - "2211": { + "2281": { "op": "concat", "defined_out": [ "_i#0", @@ -14193,7 +14427,7 @@ "result%1#0" ] }, - "2212": { + "2282": { "op": "frame_dig 1", "defined_out": [ "_i#0", @@ -14211,7 +14445,7 @@ "out#0" ] }, - "2214": { + "2284": { "op": "dup", "defined_out": [ "_i#0", @@ -14231,7 +14465,7 @@ "out#0 (copy)" ] }, - "2215": { + "2285": { "op": "intc_1 // 0", "stack_out": [ "tmp%0#0", @@ -14244,7 +14478,7 @@ "0" ] }, - "2216": { + "2286": { "op": "extract_uint16", "defined_out": [ "_i#0", @@ -14264,7 +14498,7 @@ "l_count%0#0" ] }, - "2217": { + "2287": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -14276,7 +14510,7 @@ "out#0" ] }, - "2218": { + "2288": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -14297,7 +14531,7 @@ "l_head_and_tail%0#0" ] }, - "2221": { + "2291": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -14320,7 +14554,7 @@ "1" ] }, - "2222": { + "2292": { "op": "uncover 3", "stack_out": [ "tmp%0#0", @@ -14333,7 +14567,7 @@ "result%1#0" ] }, - "2224": { + "2294": { "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", "op": "callsub dynamic_array_concat_dynamic_element", "stack_out": [ @@ -14344,7 +14578,7 @@ "out#0" ] }, - "2227": { + "2297": { "op": "frame_bury 1", "defined_out": [ "_i#0", @@ -14359,7 +14593,7 @@ "_i#0" ] }, - "2229": { + "2299": { "block": "get_assets_labels_after_if_else@5", "stack_in": [ "tmp%0#0", @@ -14379,7 +14613,7 @@ "_i#0" ] }, - "2231": { + "2301": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -14394,7 +14628,7 @@ "1" ] }, - "2232": { + "2302": { "op": "+", "stack_out": [ "tmp%0#0", @@ -14404,7 +14638,7 @@ "_i#0" ] }, - "2233": { + "2303": { "op": "frame_bury 3", "defined_out": [ "_i#0" @@ -14416,10 +14650,10 @@ "_i#0" ] }, - "2235": { + "2305": { "op": "b get_assets_labels_for_header@1" }, - "2238": { + "2308": { "block": "get_assets_labels_else_body@4", "stack_in": [ "tmp%0#0", @@ -14439,7 +14673,7 @@ "out#0" ] }, - "2240": { + "2310": { "op": "dup", "defined_out": [ "out#0", @@ -14454,7 +14688,7 @@ "out#0 (copy)" ] }, - "2241": { + "2311": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -14471,7 +14705,7 @@ "0" ] }, - "2242": { + "2312": { "op": "extract_uint16", "defined_out": [ "l_count%1#0", @@ -14486,7 +14720,7 @@ "l_count%1#0" ] }, - "2243": { + "2313": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -14497,7 +14731,7 @@ "out#0" ] }, - "2244": { + "2314": { "op": "extract 2 0", "defined_out": [ "l_count%1#0", @@ -14513,7 +14747,7 @@ "l_head_and_tail%1#0" ] }, - "2247": { + "2317": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -14531,7 +14765,7 @@ "1" ] }, - "2248": { + "2318": { "op": "pushbytes 0x00020000", "defined_out": [ "0x00020000", @@ -14551,7 +14785,7 @@ "0x00020000" ] }, - "2254": { + "2324": { "callsub": "_puya_lib.arc4.dynamic_array_concat_dynamic_element", "op": "callsub dynamic_array_concat_dynamic_element", "stack_out": [ @@ -14562,7 +14796,7 @@ "out#0" ] }, - "2257": { + "2327": { "op": "frame_bury 1", "defined_out": [ "out#0" @@ -14574,10 +14808,10 @@ "_i#0" ] }, - "2259": { + "2329": { "op": "b get_assets_labels_after_if_else@5" }, - "2262": { + "2332": { "block": "get_assets_labels_after_for@7", "stack_in": [ "tmp%0#0", @@ -14597,14 +14831,14 @@ "out#0" ] }, - "2264": { + "2334": { "op": "frame_bury 0" }, - "2266": { + "2336": { "retsub": true, "op": "retsub" }, - "2267": { + "2337": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", "params": { "asset_id#0": "uint64" @@ -14613,7 +14847,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2270": { + "2340": { "op": "frame_dig -1", "defined_out": [ "asset_id#0 (copy)" @@ -14622,7 +14856,7 @@ "asset_id#0 (copy)" ] }, - "2272": { + "2342": { "op": "asset_params_get AssetUnitName", "defined_out": [ "check%0#0", @@ -14633,14 +14867,14 @@ "check%0#0" ] }, - "2274": { + "2344": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ "value%0#0" ] }, - "2275": { + "2345": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -14650,14 +14884,14 @@ "tmp%0#0" ] }, - "2278": { + "2348": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", "asset_id#0 (copy)" ] }, - "2280": { + "2350": { "op": "asset_params_get AssetDecimals", "defined_out": [ "check%1#0", @@ -14670,7 +14904,7 @@ "check%1#0" ] }, - "2282": { + "2352": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -14678,7 +14912,7 @@ "value%1#0" ] }, - "2283": { + "2353": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -14689,7 +14923,7 @@ "val_as_bytes%0#0" ] }, - "2284": { + "2354": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -14702,7 +14936,7 @@ "val_as_bytes%0#0 (copy)" ] }, - "2285": { + "2355": { "op": "bitlen", "defined_out": [ "bitlen%0#0", @@ -14715,7 +14949,7 @@ "bitlen%0#0" ] }, - "2286": { + "2356": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -14730,7 +14964,7 @@ "8" ] }, - "2287": { + "2357": { "op": "<=", "defined_out": [ "no_overflow%0#0", @@ -14743,7 +14977,7 @@ "no_overflow%0#0" ] }, - "2288": { + "2358": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -14751,7 +14985,7 @@ "val_as_bytes%0#0" ] }, - "2289": { + "2359": { "op": "extract 7 1", "defined_out": [ "tmp%0#0", @@ -14762,7 +14996,7 @@ "uint8%0#0" ] }, - "2292": { + "2362": { "op": "pushbytes 0x0003", "defined_out": [ "0x0003", @@ -14775,7 +15009,7 @@ "0x0003" ] }, - "2296": { + "2366": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -14783,7 +15017,7 @@ "uint8%0#0" ] }, - "2297": { + "2367": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%2#0", @@ -14794,14 +15028,14 @@ "encoded_tuple_buffer%2#0" ] }, - "2298": { + "2368": { "op": "swap", "stack_out": [ "encoded_tuple_buffer%2#0", "tmp%0#0" ] }, - "2299": { + "2369": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%3#0" @@ -14810,11 +15044,11 @@ "encoded_tuple_buffer%3#0" ] }, - "2300": { + "2370": { "retsub": true, "op": "retsub" }, - "2301": { + "2371": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro", "params": { "asset#0": "uint64" @@ -14823,7 +15057,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2304": { + "2374": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -14832,7 +15066,7 @@ "asset#0 (copy)" ] }, - "2306": { + "2376": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", "op": "callsub _get_asset_micro", "defined_out": [ @@ -14842,11 +15076,11 @@ "tmp%0#0" ] }, - "2309": { + "2379": { "retsub": true, "op": "retsub" }, - "2310": { + "2380": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro", "params": { "assets#0": "bytes" @@ -14855,7 +15089,7 @@ "stack_in": [], "op": "proto 1 0" }, - "2313": { + "2383": { "op": "frame_dig -1", "defined_out": [ "assets#0 (copy)" @@ -14864,7 +15098,7 @@ "assets#0 (copy)" ] }, - "2315": { + "2385": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -14875,7 +15109,7 @@ "0" ] }, - "2316": { + "2386": { "op": "extract_uint16", "defined_out": [ "array_length%0#0" @@ -14884,7 +15118,7 @@ "array_length%0#0" ] }, - "2317": { + "2387": { "op": "intc_1 // 0", "defined_out": [ "_i#0", @@ -14895,7 +15129,7 @@ "_i#0" ] }, - "2318": { + "2388": { "block": "get_assets_micro_for_header@1", "stack_in": [ "array_length%0#0", @@ -14911,7 +15145,7 @@ "_i#0" ] }, - "2320": { + "2390": { "op": "frame_dig 0", "defined_out": [ "_i#0", @@ -14924,7 +15158,7 @@ "array_length%0#0" ] }, - "2322": { + "2392": { "op": "<", "defined_out": [ "_i#0", @@ -14937,14 +15171,14 @@ "continue_looping%0#0" ] }, - "2323": { + "2393": { "op": "bz get_assets_micro_after_for@4", "stack_out": [ "array_length%0#0", "_i#0" ] }, - "2326": { + "2396": { "op": "frame_dig -1", "defined_out": [ "_i#0", @@ -14957,7 +15191,7 @@ "assets#0 (copy)" ] }, - "2328": { + "2398": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -14970,7 +15204,7 @@ "array_head_and_tail%0#0" ] }, - "2331": { + "2401": { "op": "frame_dig 1", "stack_out": [ "array_length%0#0", @@ -14979,7 +15213,7 @@ "_i#0" ] }, - "2333": { + "2403": { "op": "dup", "defined_out": [ "_i#0", @@ -14995,7 +15229,7 @@ "_i#0 (copy)" ] }, - "2334": { + "2404": { "op": "cover 2", "stack_out": [ "array_length%0#0", @@ -15005,7 +15239,7 @@ "_i#0 (copy)" ] }, - "2336": { + "2406": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -15023,7 +15257,7 @@ "8" ] }, - "2337": { + "2407": { "op": "*", "defined_out": [ "_i#0", @@ -15039,7 +15273,7 @@ "item_offset%0#0" ] }, - "2338": { + "2408": { "op": "extract_uint64", "defined_out": [ "_i#0", @@ -15053,7 +15287,7 @@ "tmp%0#0" ] }, - "2339": { + "2409": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro", "op": "callsub _get_asset_micro", "defined_out": [ @@ -15068,7 +15302,7 @@ "tmp%1#0" ] }, - "2342": { + "2412": { "op": "log", "stack_out": [ "array_length%0#0", @@ -15076,7 +15310,7 @@ "_i#0" ] }, - "2343": { + "2413": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -15090,7 +15324,7 @@ "1" ] }, - "2344": { + "2414": { "op": "+", "stack_out": [ "array_length%0#0", @@ -15098,7 +15332,7 @@ "_i#0" ] }, - "2345": { + "2415": { "op": "frame_bury 1", "defined_out": [ "_i#0", @@ -15109,10 +15343,10 @@ "_i#0" ] }, - "2347": { + "2417": { "op": "b get_assets_micro_for_header@1" }, - "2350": { + "2420": { "block": "get_assets_micro_after_for@4", "stack_in": [ "array_length%0#0", @@ -15121,7 +15355,7 @@ "retsub": true, "op": "retsub" }, - "2351": { + "2421": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels", "params": { "asset_id#0": "uint64" @@ -15130,7 +15364,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2354": { + "2424": { "op": "frame_dig -1", "defined_out": [ "asset_id#0 (copy)" @@ -15139,7 +15373,7 @@ "asset_id#0 (copy)" ] }, - "2356": { + "2426": { "op": "asset_params_get AssetUnitName", "defined_out": [ "check%0#0", @@ -15150,14 +15384,14 @@ "check%0#0" ] }, - "2358": { + "2428": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ "value%0#0" ] }, - "2359": { + "2429": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -15167,14 +15401,14 @@ "tmp%0#0" ] }, - "2362": { + "2432": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", "asset_id#0 (copy)" ] }, - "2364": { + "2434": { "op": "asset_params_get AssetDecimals", "defined_out": [ "check%1#0", @@ -15187,7 +15421,7 @@ "check%1#0" ] }, - "2366": { + "2436": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -15195,7 +15429,7 @@ "value%1#0" ] }, - "2367": { + "2437": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -15206,7 +15440,7 @@ "val_as_bytes%0#0" ] }, - "2368": { + "2438": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -15219,7 +15453,7 @@ "val_as_bytes%0#0 (copy)" ] }, - "2369": { + "2439": { "op": "bitlen", "defined_out": [ "bitlen%0#0", @@ -15232,7 +15466,7 @@ "bitlen%0#0" ] }, - "2370": { + "2440": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -15247,7 +15481,7 @@ "8" ] }, - "2371": { + "2441": { "op": "<=", "defined_out": [ "no_overflow%0#0", @@ -15260,7 +15494,7 @@ "no_overflow%0#0" ] }, - "2372": { + "2442": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -15268,7 +15502,7 @@ "val_as_bytes%0#0" ] }, - "2373": { + "2443": { "op": "extract 7 1", "defined_out": [ "tmp%0#0", @@ -15279,7 +15513,7 @@ "uint8%0#0" ] }, - "2376": { + "2446": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", @@ -15287,7 +15521,7 @@ "asset_id#0 (copy)" ] }, - "2378": { + "2448": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -15300,7 +15534,7 @@ "tmp%1#0" ] }, - "2379": { + "2449": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -15314,7 +15548,7 @@ "tmp%1#0" ] }, - "2380": { + "2450": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -15331,7 +15565,7 @@ "maybe_exists%0#0" ] }, - "2381": { + "2451": { "op": "bury 1", "stack_out": [ "tmp%0#0", @@ -15340,7 +15574,7 @@ "maybe_exists%0#0" ] }, - "2383": { + "2453": { "op": "bz _get_asset_micro_labels_ternary_false@2", "stack_out": [ "tmp%0#0", @@ -15348,7 +15582,7 @@ "tmp%1#0" ] }, - "2386": { + "2456": { "op": "frame_dig 2", "stack_out": [ "tmp%0#0", @@ -15357,7 +15591,7 @@ "tmp%1#0" ] }, - "2388": { + "2458": { "op": "box_get", "defined_out": [ "maybe_exists%1#0", @@ -15374,7 +15608,7 @@ "maybe_exists%1#0" ] }, - "2389": { + "2459": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "defined_out": [ @@ -15390,7 +15624,7 @@ "ternary_result%0#1" ] }, - "2390": { + "2460": { "block": "_get_asset_micro_labels_ternary_merge@3", "stack_in": [ "tmp%0#0", @@ -15410,7 +15644,7 @@ "tmp%0#0" ] }, - "2392": { + "2462": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -15425,7 +15659,7 @@ "tmp%0#0 (copy)" ] }, - "2393": { + "2463": { "op": "len", "defined_out": [ "data_length%0#0", @@ -15440,7 +15674,7 @@ "data_length%0#0" ] }, - "2394": { + "2464": { "op": "pushint 5 // 5", "defined_out": [ "5", @@ -15457,7 +15691,7 @@ "5" ] }, - "2396": { + "2466": { "op": "+", "defined_out": [ "current_tail_offset%1#0", @@ -15472,7 +15706,7 @@ "current_tail_offset%1#0" ] }, - "2397": { + "2467": { "op": "pushbytes 0x0005", "defined_out": [ "0x0005", @@ -15489,7 +15723,7 @@ "0x0005" ] }, - "2401": { + "2471": { "op": "frame_dig 1", "defined_out": [ "0x0005", @@ -15508,7 +15742,7 @@ "uint8%0#0" ] }, - "2403": { + "2473": { "op": "concat", "defined_out": [ "current_tail_offset%1#0", @@ -15526,7 +15760,7 @@ "encoded_tuple_buffer%2#0" ] }, - "2404": { + "2474": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -15538,7 +15772,7 @@ "current_tail_offset%1#0" ] }, - "2405": { + "2475": { "op": "itob", "defined_out": [ "as_bytes%1#0", @@ -15556,7 +15790,7 @@ "as_bytes%1#0" ] }, - "2406": { + "2476": { "op": "extract 6 2", "defined_out": [ "encoded_tuple_buffer%2#0", @@ -15574,7 +15808,7 @@ "offset_as_uint16%1#0" ] }, - "2409": { + "2479": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%3#0", @@ -15590,7 +15824,7 @@ "encoded_tuple_buffer%3#0" ] }, - "2410": { + "2480": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -15601,7 +15835,7 @@ "tmp%0#0" ] }, - "2411": { + "2481": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -15616,7 +15850,7 @@ "encoded_tuple_buffer%4#0" ] }, - "2412": { + "2482": { "op": "swap", "defined_out": [ "encoded_tuple_buffer%4#0", @@ -15632,7 +15866,7 @@ "ternary_result%0#1" ] }, - "2413": { + "2483": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%5#0", @@ -15646,14 +15880,14 @@ "encoded_tuple_buffer%5#0" ] }, - "2414": { + "2484": { "op": "frame_bury 0" }, - "2416": { + "2486": { "retsub": true, "op": "retsub" }, - "2417": { + "2487": { "block": "_get_asset_micro_labels_ternary_false@2", "stack_in": [ "tmp%0#0", @@ -15671,10 +15905,10 @@ "ternary_result%0#1" ] }, - "2418": { + "2488": { "op": "b _get_asset_micro_labels_ternary_merge@3" }, - "2421": { + "2491": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro_labels", "params": { "asset#0": "uint64" @@ -15683,7 +15917,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2424": { + "2494": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -15692,7 +15926,7 @@ "asset#0 (copy)" ] }, - "2426": { + "2496": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels", "op": "callsub _get_asset_micro_labels", "defined_out": [ @@ -15702,11 +15936,11 @@ "tmp%0#0" ] }, - "2429": { + "2499": { "retsub": true, "op": "retsub" }, - "2430": { + "2500": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro_labels", "params": { "assets#0": "bytes" @@ -15715,7 +15949,7 @@ "stack_in": [], "op": "proto 1 0" }, - "2433": { + "2503": { "op": "frame_dig -1", "defined_out": [ "assets#0 (copy)" @@ -15724,7 +15958,7 @@ "assets#0 (copy)" ] }, - "2435": { + "2505": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -15735,7 +15969,7 @@ "0" ] }, - "2436": { + "2506": { "op": "extract_uint16", "defined_out": [ "array_length%0#0" @@ -15744,7 +15978,7 @@ "array_length%0#0" ] }, - "2437": { + "2507": { "op": "intc_1 // 0", "defined_out": [ "_i#0", @@ -15755,7 +15989,7 @@ "_i#0" ] }, - "2438": { + "2508": { "block": "get_assets_micro_labels_for_header@1", "stack_in": [ "array_length%0#0", @@ -15771,7 +16005,7 @@ "_i#0" ] }, - "2440": { + "2510": { "op": "frame_dig 0", "defined_out": [ "_i#0", @@ -15784,7 +16018,7 @@ "array_length%0#0" ] }, - "2442": { + "2512": { "op": "<", "defined_out": [ "_i#0", @@ -15797,14 +16031,14 @@ "continue_looping%0#0" ] }, - "2443": { + "2513": { "op": "bz get_assets_micro_labels_after_for@4", "stack_out": [ "array_length%0#0", "_i#0" ] }, - "2446": { + "2516": { "op": "frame_dig -1", "defined_out": [ "_i#0", @@ -15817,7 +16051,7 @@ "assets#0 (copy)" ] }, - "2448": { + "2518": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -15830,7 +16064,7 @@ "array_head_and_tail%0#0" ] }, - "2451": { + "2521": { "op": "frame_dig 1", "stack_out": [ "array_length%0#0", @@ -15839,7 +16073,7 @@ "_i#0" ] }, - "2453": { + "2523": { "op": "dup", "defined_out": [ "_i#0", @@ -15855,7 +16089,7 @@ "_i#0 (copy)" ] }, - "2454": { + "2524": { "op": "cover 2", "stack_out": [ "array_length%0#0", @@ -15865,7 +16099,7 @@ "_i#0 (copy)" ] }, - "2456": { + "2526": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -15883,7 +16117,7 @@ "8" ] }, - "2457": { + "2527": { "op": "*", "defined_out": [ "_i#0", @@ -15899,7 +16133,7 @@ "item_offset%0#0" ] }, - "2458": { + "2528": { "op": "extract_uint64", "defined_out": [ "_i#0", @@ -15913,7 +16147,7 @@ "tmp%0#0" ] }, - "2459": { + "2529": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels", "op": "callsub _get_asset_micro_labels", "defined_out": [ @@ -15928,7 +16162,7 @@ "tmp%1#0" ] }, - "2462": { + "2532": { "op": "log", "stack_out": [ "array_length%0#0", @@ -15936,7 +16170,7 @@ "_i#0" ] }, - "2463": { + "2533": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -15950,7 +16184,7 @@ "1" ] }, - "2464": { + "2534": { "op": "+", "stack_out": [ "array_length%0#0", @@ -15958,7 +16192,7 @@ "_i#0" ] }, - "2465": { + "2535": { "op": "frame_bury 1", "defined_out": [ "_i#0", @@ -15969,10 +16203,10 @@ "_i#0" ] }, - "2467": { + "2537": { "op": "b get_assets_micro_labels_for_header@1" }, - "2470": { + "2540": { "block": "get_assets_micro_labels_after_for@4", "stack_in": [ "array_length%0#0", @@ -15981,7 +16215,7 @@ "retsub": true, "op": "retsub" }, - "2471": { + "2541": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", "params": { "asset_id#0": "uint64" @@ -15990,7 +16224,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2474": { + "2544": { "op": "frame_dig -1", "defined_out": [ "asset_id#0 (copy)" @@ -15999,7 +16233,7 @@ "asset_id#0 (copy)" ] }, - "2476": { + "2546": { "op": "asset_params_get AssetName", "defined_out": [ "check%0#0", @@ -16010,14 +16244,14 @@ "check%0#0" ] }, - "2478": { + "2548": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ "value%0#0" ] }, - "2479": { + "2549": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -16027,14 +16261,14 @@ "tmp%0#0" ] }, - "2482": { + "2552": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", "asset_id#0 (copy)" ] }, - "2484": { + "2554": { "op": "asset_params_get AssetUnitName", "defined_out": [ "check%1#0", @@ -16047,7 +16281,7 @@ "check%1#0" ] }, - "2486": { + "2556": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -16055,7 +16289,7 @@ "value%1#0" ] }, - "2487": { + "2557": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -16067,7 +16301,7 @@ "tmp%1#0" ] }, - "2490": { + "2560": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", @@ -16075,38 +16309,34 @@ "asset_id#0 (copy)" ] }, - "2492": { - "op": "itob", + "2562": { + "op": "asset_params_get AssetURL", "defined_out": [ + "check%2#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "value%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "value%2#0", + "check%2#0" ] }, - "2493": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%1#0", - "tmp%2#0" - ], + "2564": { + "error": "asset exists", + "op": "assert // asset exists", "stack_out": [ "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "tmp%2#0" + "value%2#0" ] }, - "2494": { - "op": "box_len", + "2565": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", "tmp%0#0", "tmp%1#0", "tmp%2#0" @@ -16114,363 +16344,363 @@ "stack_out": [ "tmp%0#0", "tmp%1#0", - "tmp%2#0", - "maybe_value%0#0", - "maybe_exists%0#0" + "tmp%2#0" ] }, - "2495": { - "op": "bury 1", + "2568": { + "op": "frame_dig -1", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "maybe_exists%0#0" + "asset_id#0 (copy)" ] }, - "2497": { - "op": "bz _get_asset_text_ternary_false@2", - "stack_out": [ + "2570": { + "op": "itob", + "defined_out": [ "tmp%0#0", "tmp%1#0", - "tmp%2#0" - ] - }, - "2500": { - "op": "frame_dig 2", + "tmp%2#0", + "tmp%3#0" + ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%2#0" + "tmp%3#0" ] }, - "2502": { - "op": "box_get", + "2571": { + "op": "dup", "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%2#0", + "tmp%3#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "maybe_value%1#0", - "maybe_exists%1#0" + "tmp%3#0", + "tmp%3#0" ] }, - "2503": { - "error": "check self.assets entry exists", - "op": "assert // check self.assets entry exists", + "2572": { + "op": "box_len", "defined_out": [ - "ternary_result%0#1", + "maybe_exists%0#0", + "maybe_value%0#0", "tmp%0#0", "tmp%1#0", - "tmp%2#0" + "tmp%2#0", + "tmp%3#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "ternary_result%0#1" + "tmp%3#0", + "maybe_value%0#0", + "maybe_exists%0#0" ] }, - "2504": { - "block": "_get_asset_text_ternary_merge@3", - "stack_in": [ + "2573": { + "op": "bury 1", + "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "ternary_result%0#1" - ], - "op": "frame_dig -1", - "defined_out": [ - "asset_id#0 (copy)" - ], + "tmp%3#0", + "maybe_exists%0#0" + ] + }, + "2575": { + "op": "bz _get_asset_text_ternary_false@2", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "ternary_result%0#1", - "asset_id#0 (copy)" + "tmp%3#0" ] }, - "2506": { - "op": "asset_params_get AssetURL", - "defined_out": [ - "check%2#0", - "value%2#0" - ], + "2578": { + "op": "frame_dig 3", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "ternary_result%0#1", - "value%2#0", - "check%2#0" + "tmp%3#0", + "tmp%3#0" ] }, - "2508": { - "error": "asset exists", - "op": "assert // asset exists", + "2580": { + "op": "box_get", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "ternary_result%0#1", - "value%2#0" + "tmp%3#0", + "maybe_value%1#0", + "maybe_exists%1#0" ] }, - "2509": { - "callsub": "smart_contracts.asset_labeling.contract.b2str", - "op": "callsub b2str", + "2581": { + "error": "check self.assets entry exists", + "op": "assert // check self.assets entry exists", "defined_out": [ - "tmp%6#0" + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "ternary_result%0#1", - "tmp%6#0" + "tmp%3#0", + "ternary_result%0#1" ] }, - "2512": { + "2582": { + "block": "_get_asset_text_ternary_merge@3", + "stack_in": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1" + ], "op": "frame_dig 0", "defined_out": [ - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0" ] }, - "2514": { + "2584": { "op": "dup", "defined_out": [ "tmp%0#0", - "tmp%0#0 (copy)", - "tmp%6#0" + "tmp%0#0 (copy)" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%0#0 (copy)" ] }, - "2515": { + "2585": { "op": "len", "defined_out": [ "data_length%0#0", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "data_length%0#0" ] }, - "2516": { + "2586": { "op": "intc_3 // 8", "defined_out": [ "8", "data_length%0#0", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "data_length%0#0", "8" ] }, - "2517": { + "2587": { "op": "+", "defined_out": [ "current_tail_offset%1#0", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0" ] }, - "2518": { + "2588": { "op": "dup", "defined_out": [ "current_tail_offset%1#0", "current_tail_offset%1#0 (copy)", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "current_tail_offset%1#0 (copy)" ] }, - "2519": { + "2589": { "op": "itob", "defined_out": [ "as_bytes%1#0", "current_tail_offset%1#0", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "as_bytes%1#0" ] }, - "2520": { + "2590": { "op": "extract 6 2", "defined_out": [ "current_tail_offset%1#0", "offset_as_uint16%1#0", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "offset_as_uint16%1#0" ] }, - "2523": { + "2593": { "op": "pushbytes 0x0008", "defined_out": [ "0x0008", "current_tail_offset%1#0", "offset_as_uint16%1#0", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "offset_as_uint16%1#0", "0x0008" ] }, - "2527": { + "2597": { "op": "swap", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "0x0008", "offset_as_uint16%1#0" ] }, - "2528": { + "2598": { "op": "concat", "defined_out": [ "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", - "tmp%0#0", - "tmp%6#0" + "tmp%0#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "encoded_tuple_buffer%2#0" ] }, - "2529": { + "2599": { "op": "frame_dig 1", "defined_out": [ "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0", - "tmp%6#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", "tmp%1#0" ] }, - "2531": { + "2601": { "op": "dup", "defined_out": [ "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", "tmp%0#0", "tmp%1#0", - "tmp%1#0 (copy)", - "tmp%6#0" + "tmp%1#0 (copy)" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "current_tail_offset%1#0", "encoded_tuple_buffer%2#0", @@ -16478,14 +16708,14 @@ "tmp%1#0 (copy)" ] }, - "2532": { + "2602": { "op": "cover 3", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%1#0", @@ -16493,22 +16723,21 @@ "tmp%1#0 (copy)" ] }, - "2534": { + "2604": { "op": "len", "defined_out": [ "current_tail_offset%1#0", "data_length%1#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0", - "tmp%6#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%1#0", @@ -16516,14 +16745,14 @@ "data_length%1#0" ] }, - "2535": { + "2605": { "op": "uncover 2", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16531,43 +16760,41 @@ "current_tail_offset%1#0" ] }, - "2537": { + "2607": { "op": "+", "defined_out": [ "current_tail_offset%2#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0", - "tmp%6#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", "current_tail_offset%2#0" ] }, - "2538": { + "2608": { "op": "dup", "defined_out": [ "current_tail_offset%2#0", "current_tail_offset%2#0 (copy)", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0", - "tmp%6#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16575,22 +16802,21 @@ "current_tail_offset%2#0 (copy)" ] }, - "2539": { + "2609": { "op": "itob", "defined_out": [ "as_bytes%2#0", "current_tail_offset%2#0", "encoded_tuple_buffer%2#0", "tmp%0#0", - "tmp%1#0", - "tmp%6#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16598,22 +16824,21 @@ "as_bytes%2#0" ] }, - "2540": { + "2610": { "op": "extract 6 2", "defined_out": [ "current_tail_offset%2#0", "encoded_tuple_buffer%2#0", "offset_as_uint16%2#0", "tmp%0#0", - "tmp%1#0", - "tmp%6#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "encoded_tuple_buffer%2#0", @@ -16621,14 +16846,14 @@ "offset_as_uint16%2#0" ] }, - "2543": { + "2613": { "op": "uncover 2", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", @@ -16636,14 +16861,14 @@ "encoded_tuple_buffer%2#0" ] }, - "2545": { + "2615": { "op": "swap", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", @@ -16651,363 +16876,1156 @@ "offset_as_uint16%2#0" ] }, - "2546": { + "2616": { "op": "concat", "defined_out": [ "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", "tmp%0#0", - "tmp%1#0", - "tmp%6#0" + "tmp%1#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", + "tmp%3#0", "ternary_result%0#1", - "tmp%6#0", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0" ] }, - "2547": { - "op": "uncover 5", + "2617": { + "op": "frame_dig 2", "defined_out": [ "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "tmp%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1" + "tmp%2#0" ] }, - "2549": { + "2619": { "op": "dup", "defined_out": [ "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1 (copy)", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0", + "tmp%2#0 (copy)" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "tmp%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1 (copy)", - "ternary_result%0#1 (copy)" + "tmp%2#0 (copy)", + "tmp%2#0 (copy)" ] }, - "2550": { + "2620": { "op": "cover 3", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "tmp%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "ternary_result%0#1", + "tmp%2#0", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1 (copy)" + "tmp%2#0 (copy)" ] }, - "2552": { + "2622": { "op": "len", "defined_out": [ "current_tail_offset%2#0", "data_length%2#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "tmp%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "ternary_result%0#1", + "tmp%2#0", "current_tail_offset%2#0", "encoded_tuple_buffer%3#0", "data_length%2#0" ] }, - "2553": { + "2623": { "op": "uncover 2", "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "tmp%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "ternary_result%0#1", + "tmp%2#0", "encoded_tuple_buffer%3#0", "data_length%2#0", "current_tail_offset%2#0" ] }, - "2555": { + "2625": { "op": "+", "defined_out": [ "current_tail_offset%3#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "tmp%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "ternary_result%0#1", + "tmp%2#0", "encoded_tuple_buffer%3#0", "current_tail_offset%3#0" ] }, - "2556": { + "2626": { "op": "itob", "defined_out": [ "as_bytes%3#0", "encoded_tuple_buffer%3#0", - "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "tmp%3#0", + "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "ternary_result%0#1", + "tmp%2#0", "encoded_tuple_buffer%3#0", "as_bytes%3#0" ] }, - "2557": { + "2627": { "op": "extract 6 2", "defined_out": [ "encoded_tuple_buffer%3#0", "offset_as_uint16%3#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%3#0", + "offset_as_uint16%3#0" + ] + }, + "2630": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%4#0" + ] + }, + "2631": { + "op": "uncover 3", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%4#0", + "tmp%0#0" + ] + }, + "2633": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%5#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%1#0", + "tmp%2#0", + "encoded_tuple_buffer%5#0" + ] + }, + "2634": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%2#0", + "encoded_tuple_buffer%5#0", + "tmp%1#0" + ] + }, + "2636": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%6#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "tmp%2#0", + "encoded_tuple_buffer%6#0" + ] + }, + "2637": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "encoded_tuple_buffer%6#0", + "tmp%2#0" + ] + }, + "2638": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%7#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1", + "encoded_tuple_buffer%7#0" + ] + }, + "2639": { + "op": "swap", + "defined_out": [ + "encoded_tuple_buffer%7#0", "ternary_result%0#1", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "encoded_tuple_buffer%7#0", + "ternary_result%0#1" + ] + }, + "2640": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%8#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "encoded_tuple_buffer%8#0" + ] + }, + "2641": { + "op": "frame_bury 0" + }, + "2643": { + "retsub": true, + "op": "retsub" + }, + "2644": { + "block": "_get_asset_text_ternary_false@2", + "stack_in": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0" + ], + "op": "bytec_2 // 0x0000", + "defined_out": [ + "ternary_result%0#1" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%3#0", + "ternary_result%0#1" + ] + }, + "2645": { + "op": "b _get_asset_text_ternary_merge@3" + }, + "2648": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text", + "params": { + "asset#0": "uint64" + }, + "block": "get_asset_text", + "stack_in": [], + "op": "proto 1 1" + }, + "2651": { + "op": "frame_dig -1", + "defined_out": [ + "asset#0 (copy)" + ], + "stack_out": [ + "asset#0 (copy)" + ] + }, + "2653": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", + "op": "callsub _get_asset_text", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2656": { + "retsub": true, + "op": "retsub" + }, + "2657": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text", + "params": { + "assets#0": "bytes" + }, + "block": "get_assets_text", + "stack_in": [], + "op": "proto 1 0" + }, + "2660": { + "op": "frame_dig -1", + "defined_out": [ + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)" + ] + }, + "2662": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "assets#0 (copy)" + ], + "stack_out": [ + "assets#0 (copy)", + "0" + ] + }, + "2663": { + "op": "extract_uint16", + "defined_out": [ + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0" + ] + }, + "2664": { + "op": "intc_1 // 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2665": { + "block": "get_assets_text_for_header@1", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "_i#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2667": { + "op": "frame_dig 0", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_length%0#0" + ] + }, + "2669": { + "op": "<", + "defined_out": [ + "_i#0", + "array_length%0#0", + "continue_looping%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "continue_looping%0#0" + ] + }, + "2670": { + "op": "bz get_assets_text_after_for@4", + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2673": { + "op": "frame_dig -1", + "defined_out": [ + "_i#0", + "array_length%0#0", + "assets#0 (copy)" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "assets#0 (copy)" + ] + }, + "2675": { + "op": "extract 2 0", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0" + ] + }, + "2678": { + "op": "frame_dig 1", + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0" + ] + }, + "2680": { + "op": "dup", + "defined_out": [ + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "_i#0 (copy)" + ] + }, + "2681": { + "op": "cover 2", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)" + ] + }, + "2683": { + "op": "intc_3 // 8", + "defined_out": [ + "8", + "_i#0", + "_i#0 (copy)", + "array_head_and_tail%0#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "_i#0 (copy)", + "8" + ] + }, + "2684": { + "op": "*", + "defined_out": [ + "_i#0", + "array_head_and_tail%0#0", + "array_length%0#0", + "item_offset%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "array_head_and_tail%0#0", + "item_offset%0#0" + ] + }, + "2685": { + "op": "extract_uint64", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%0#0" + ] + }, + "2686": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", + "op": "callsub _get_asset_text", + "defined_out": [ + "_i#0", + "array_length%0#0", + "tmp%1#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "tmp%1#0" + ] + }, + "2689": { + "op": "log", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2690": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0", + "1" + ] + }, + "2691": { + "op": "+", + "stack_out": [ + "array_length%0#0", + "_i#0", + "_i#0" + ] + }, + "2692": { + "op": "frame_bury 1", + "defined_out": [ + "_i#0", + "array_length%0#0" + ], + "stack_out": [ + "array_length%0#0", + "_i#0" + ] + }, + "2694": { + "op": "b get_assets_text_for_header@1" + }, + "2697": { + "block": "get_assets_text_after_for@4", + "stack_in": [ + "array_length%0#0", + "_i#0" + ], + "retsub": true, + "op": "retsub" + }, + "2698": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text_labels", + "params": { + "asset_id#0": "uint64" + }, + "block": "_get_asset_text_labels", + "stack_in": [], + "op": "proto 1 1" + }, + "2701": { + "op": "frame_dig -1", + "defined_out": [ + "asset_id#0 (copy)" + ], + "stack_out": [ + "asset_id#0 (copy)" + ] + }, + "2703": { + "op": "asset_params_get AssetName", + "defined_out": [ + "check%0#0", + "value%0#0" + ], + "stack_out": [ + "value%0#0", + "check%0#0" + ] + }, + "2705": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "value%0#0" + ] + }, + "2706": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2709": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "asset_id#0 (copy)" + ] + }, + "2711": { + "op": "asset_params_get AssetUnitName", + "defined_out": [ + "check%1#0", + "tmp%0#0", + "value%1#0" + ], + "stack_out": [ + "tmp%0#0", + "value%1#0", + "check%1#0" + ] + }, + "2713": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "value%1#0" + ] + }, + "2714": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0" + ] + }, + "2717": { + "op": "frame_dig -1", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "asset_id#0 (copy)" + ] + }, + "2719": { + "op": "asset_params_get AssetURL", + "defined_out": [ + "check%2#0", + "tmp%0#0", + "tmp%1#0", + "value%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "value%2#0", + "check%2#0" + ] + }, + "2721": { + "error": "asset exists", + "op": "assert // asset exists", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "value%2#0" + ] + }, + "2722": { + "callsub": "smart_contracts.asset_labeling.contract.b2str", + "op": "callsub b2str", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ] + }, + "2725": { + "op": "dig 2", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "tmp%0#0 (copy)" + ] + }, + "2727": { + "op": "len", + "defined_out": [ + "data_length%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "data_length%0#0" + ] + }, + "2728": { + "op": "pushint 6 // 6", + "defined_out": [ + "6", + "data_length%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "data_length%0#0", + "6" + ] + }, + "2730": { + "op": "+", + "defined_out": [ + "current_tail_offset%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%1#0" + ] + }, + "2731": { + "op": "dup", + "defined_out": [ + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%1#0", + "current_tail_offset%1#0 (copy)" + ] + }, + "2732": { + "op": "itob", + "defined_out": [ + "as_bytes%1#0", + "current_tail_offset%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%1#0", + "as_bytes%1#0" + ] + }, + "2733": { + "op": "extract 6 2", + "defined_out": [ + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0" + ] + }, + "2736": { + "op": "pushbytes 0x0006", + "defined_out": [ + "0x0006", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%1#0", + "offset_as_uint16%1#0", + "0x0006" + ] + }, + "2740": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%1#0", + "0x0006", + "offset_as_uint16%1#0" + ] + }, + "2741": { + "op": "concat", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%0#0", + "tmp%1#0", + "tmp%2#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2742": { + "op": "dig 3", + "defined_out": [ + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0", + "tmp%1#0 (copy)", + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", - "tmp%0#0", - "tmp%1#0", - "ternary_result%0#1", - "encoded_tuple_buffer%3#0", - "offset_as_uint16%3#0" + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "tmp%1#0 (copy)" ] }, - "2560": { - "op": "concat", + "2744": { + "op": "len", "defined_out": [ - "encoded_tuple_buffer%4#0", - "ternary_result%0#1", + "current_tail_offset%1#0", + "data_length%1#0", + "encoded_tuple_buffer%2#0", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", + "current_tail_offset%1#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0" + ] + }, + "2745": { + "op": "uncover 2", + "stack_out": [ "tmp%0#0", "tmp%1#0", - "ternary_result%0#1", - "encoded_tuple_buffer%4#0" + "tmp%2#0", + "encoded_tuple_buffer%2#0", + "data_length%1#0", + "current_tail_offset%1#0" ] }, - "2561": { - "op": "uncover 3", + "2747": { + "op": "+", + "defined_out": [ + "current_tail_offset%2#0", + "encoded_tuple_buffer%2#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", - "tmp%1#0", - "ternary_result%0#1", - "encoded_tuple_buffer%4#0", - "tmp%0#0" + "encoded_tuple_buffer%2#0", + "current_tail_offset%2#0" ] }, - "2563": { - "op": "concat", + "2748": { + "op": "itob", "defined_out": [ - "encoded_tuple_buffer%5#0", - "ternary_result%0#1", + "as_bytes%2#0", + "encoded_tuple_buffer%2#0", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", - "tmp%1#0", - "ternary_result%0#1", - "encoded_tuple_buffer%5#0" + "encoded_tuple_buffer%2#0", + "as_bytes%2#0" ] }, - "2564": { - "op": "uncover 2", + "2749": { + "op": "extract 6 2", + "defined_out": [ + "encoded_tuple_buffer%2#0", + "offset_as_uint16%2#0", + "tmp%0#0", + "tmp%1#0", + "tmp%2#0" + ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", - "ternary_result%0#1", - "encoded_tuple_buffer%5#0", - "tmp%1#0" + "encoded_tuple_buffer%2#0", + "offset_as_uint16%2#0" ] }, - "2566": { + "2752": { "op": "concat", "defined_out": [ - "encoded_tuple_buffer%6#0", - "ternary_result%0#1", + "encoded_tuple_buffer%3#0", "tmp%0#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", - "ternary_result%0#1", - "encoded_tuple_buffer%6#0" + "encoded_tuple_buffer%3#0" ] }, - "2567": { - "op": "swap", + "2753": { + "op": "uncover 3", "stack_out": [ - "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", - "encoded_tuple_buffer%6#0", - "ternary_result%0#1" + "encoded_tuple_buffer%3#0", + "tmp%0#0" ] }, - "2568": { + "2755": { "op": "concat", "defined_out": [ - "encoded_tuple_buffer%7#0", - "tmp%0#0", + "encoded_tuple_buffer%4#0", "tmp%1#0", - "tmp%6#0" + "tmp%2#0" ], "stack_out": [ - "tmp%0#0", "tmp%1#0", "tmp%2#0", - "tmp%6#0", - "encoded_tuple_buffer%7#0" + "encoded_tuple_buffer%4#0" ] }, - "2569": { - "op": "swap", + "2756": { + "op": "uncover 2", "stack_out": [ - "tmp%0#0", - "tmp%1#0", "tmp%2#0", - "encoded_tuple_buffer%7#0", - "tmp%6#0" + "encoded_tuple_buffer%4#0", + "tmp%1#0" ] }, - "2570": { + "2758": { "op": "concat", "defined_out": [ - "encoded_tuple_buffer%8#0", - "tmp%0#0", - "tmp%1#0" + "encoded_tuple_buffer%5#0", + "tmp%2#0" ], "stack_out": [ - "tmp%0#0", - "tmp%1#0", "tmp%2#0", - "encoded_tuple_buffer%8#0" + "encoded_tuple_buffer%5#0" ] }, - "2571": { - "op": "frame_bury 0" - }, - "2573": { - "retsub": true, - "op": "retsub" - }, - "2574": { - "block": "_get_asset_text_ternary_false@2", - "stack_in": [ - "tmp%0#0", - "tmp%1#0", + "2759": { + "op": "swap", + "stack_out": [ + "encoded_tuple_buffer%5#0", "tmp%2#0" - ], - "op": "bytec_2 // 0x0000", + ] + }, + "2760": { + "op": "concat", "defined_out": [ - "ternary_result%0#1" + "encoded_tuple_buffer%6#0" ], "stack_out": [ - "tmp%0#0", - "tmp%1#0", - "tmp%2#0", - "ternary_result%0#1" + "encoded_tuple_buffer%6#0" ] }, - "2575": { - "op": "b _get_asset_text_ternary_merge@3" + "2761": { + "retsub": true, + "op": "retsub" }, - "2578": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text", + "2762": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text_labels", "params": { "asset#0": "uint64" }, - "block": "get_asset_text", + "block": "get_asset_text_labels", "stack_in": [], "op": "proto 1 1" }, - "2581": { + "2765": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -17016,9 +18034,9 @@ "asset#0 (copy)" ] }, - "2583": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", - "op": "callsub _get_asset_text", + "2767": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text_labels", + "op": "callsub _get_asset_text_labels", "defined_out": [ "tmp%0#0" ], @@ -17026,20 +18044,20 @@ "tmp%0#0" ] }, - "2586": { + "2770": { "retsub": true, "op": "retsub" }, - "2587": { - "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text", + "2771": { + "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text_labels", "params": { "assets#0": "bytes" }, - "block": "get_assets_text", + "block": "get_assets_text_labels", "stack_in": [], "op": "proto 1 0" }, - "2590": { + "2774": { "op": "frame_dig -1", "defined_out": [ "assets#0 (copy)" @@ -17048,7 +18066,7 @@ "assets#0 (copy)" ] }, - "2592": { + "2776": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -17059,7 +18077,7 @@ "0" ] }, - "2593": { + "2777": { "op": "extract_uint16", "defined_out": [ "array_length%0#0" @@ -17068,7 +18086,7 @@ "array_length%0#0" ] }, - "2594": { + "2778": { "op": "intc_1 // 0", "defined_out": [ "_i#0", @@ -17079,8 +18097,8 @@ "_i#0" ] }, - "2595": { - "block": "get_assets_text_for_header@1", + "2779": { + "block": "get_assets_text_labels_for_header@1", "stack_in": [ "array_length%0#0", "_i#0" @@ -17095,7 +18113,7 @@ "_i#0" ] }, - "2597": { + "2781": { "op": "frame_dig 0", "defined_out": [ "_i#0", @@ -17108,7 +18126,7 @@ "array_length%0#0" ] }, - "2599": { + "2783": { "op": "<", "defined_out": [ "_i#0", @@ -17121,14 +18139,14 @@ "continue_looping%0#0" ] }, - "2600": { - "op": "bz get_assets_text_after_for@4", + "2784": { + "op": "bz get_assets_text_labels_after_for@4", "stack_out": [ "array_length%0#0", "_i#0" ] }, - "2603": { + "2787": { "op": "frame_dig -1", "defined_out": [ "_i#0", @@ -17141,7 +18159,7 @@ "assets#0 (copy)" ] }, - "2605": { + "2789": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -17154,7 +18172,7 @@ "array_head_and_tail%0#0" ] }, - "2608": { + "2792": { "op": "frame_dig 1", "stack_out": [ "array_length%0#0", @@ -17163,7 +18181,7 @@ "_i#0" ] }, - "2610": { + "2794": { "op": "dup", "defined_out": [ "_i#0", @@ -17179,7 +18197,7 @@ "_i#0 (copy)" ] }, - "2611": { + "2795": { "op": "cover 2", "stack_out": [ "array_length%0#0", @@ -17189,7 +18207,7 @@ "_i#0 (copy)" ] }, - "2613": { + "2797": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -17207,7 +18225,7 @@ "8" ] }, - "2614": { + "2798": { "op": "*", "defined_out": [ "_i#0", @@ -17223,7 +18241,7 @@ "item_offset%0#0" ] }, - "2615": { + "2799": { "op": "extract_uint64", "defined_out": [ "_i#0", @@ -17237,9 +18255,9 @@ "tmp%0#0" ] }, - "2616": { - "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text", - "op": "callsub _get_asset_text", + "2800": { + "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text_labels", + "op": "callsub _get_asset_text_labels", "defined_out": [ "_i#0", "array_length%0#0", @@ -17252,7 +18270,7 @@ "tmp%1#0" ] }, - "2619": { + "2803": { "op": "log", "stack_out": [ "array_length%0#0", @@ -17260,7 +18278,7 @@ "_i#0" ] }, - "2620": { + "2804": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -17274,7 +18292,7 @@ "1" ] }, - "2621": { + "2805": { "op": "+", "stack_out": [ "array_length%0#0", @@ -17282,7 +18300,7 @@ "_i#0" ] }, - "2622": { + "2806": { "op": "frame_bury 1", "defined_out": [ "_i#0", @@ -17293,11 +18311,11 @@ "_i#0" ] }, - "2624": { - "op": "b get_assets_text_for_header@1" + "2808": { + "op": "b get_assets_text_labels_for_header@1" }, - "2627": { - "block": "get_assets_text_after_for@4", + "2811": { + "block": "get_assets_text_labels_after_for@4", "stack_in": [ "array_length%0#0", "_i#0" @@ -17305,7 +18323,7 @@ "retsub": true, "op": "retsub" }, - "2628": { + "2812": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small", "params": { "asset_id#0": "uint64" @@ -17314,7 +18332,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2631": { + "2815": { "op": "frame_dig -1", "defined_out": [ "asset_id#0 (copy)" @@ -17323,7 +18341,7 @@ "asset_id#0 (copy)" ] }, - "2633": { + "2817": { "op": "asset_params_get AssetName", "defined_out": [ "check%0#0", @@ -17334,14 +18352,14 @@ "check%0#0" ] }, - "2635": { + "2819": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ "value%0#0" ] }, - "2636": { + "2820": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -17351,14 +18369,14 @@ "tmp%0#0" ] }, - "2639": { + "2823": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", "asset_id#0 (copy)" ] }, - "2641": { + "2825": { "op": "asset_params_get AssetUnitName", "defined_out": [ "check%1#0", @@ -17371,7 +18389,7 @@ "check%1#0" ] }, - "2643": { + "2827": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -17379,7 +18397,7 @@ "value%1#0" ] }, - "2644": { + "2828": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -17391,7 +18409,7 @@ "tmp%1#0" ] }, - "2647": { + "2831": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", @@ -17399,7 +18417,7 @@ "asset_id#0 (copy)" ] }, - "2649": { + "2833": { "op": "asset_params_get AssetDecimals", "defined_out": [ "check%2#0", @@ -17414,7 +18432,7 @@ "check%2#0" ] }, - "2651": { + "2835": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -17423,7 +18441,7 @@ "value%2#0" ] }, - "2652": { + "2836": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -17436,7 +18454,7 @@ "val_as_bytes%0#0" ] }, - "2653": { + "2837": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -17451,7 +18469,7 @@ "val_as_bytes%0#0 (copy)" ] }, - "2654": { + "2838": { "op": "bitlen", "defined_out": [ "bitlen%0#0", @@ -17466,7 +18484,7 @@ "bitlen%0#0" ] }, - "2655": { + "2839": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -17483,7 +18501,7 @@ "8" ] }, - "2656": { + "2840": { "op": "<=", "defined_out": [ "no_overflow%0#0", @@ -17498,7 +18516,7 @@ "no_overflow%0#0" ] }, - "2657": { + "2841": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -17507,7 +18525,7 @@ "val_as_bytes%0#0" ] }, - "2658": { + "2842": { "op": "extract 7 1", "defined_out": [ "tmp%0#0", @@ -17520,7 +18538,7 @@ "uint8%0#0" ] }, - "2661": { + "2845": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", @@ -17529,7 +18547,7 @@ "asset_id#0 (copy)" ] }, - "2663": { + "2847": { "op": "asset_params_get AssetTotal", "defined_out": [ "check%3#0", @@ -17546,7 +18564,7 @@ "check%3#0" ] }, - "2665": { + "2849": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -17556,7 +18574,7 @@ "value%3#0" ] }, - "2666": { + "2850": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -17571,7 +18589,7 @@ "val_as_bytes%1#0" ] }, - "2667": { + "2851": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", @@ -17581,7 +18599,7 @@ "asset_id#0 (copy)" ] }, - "2669": { + "2853": { "op": "asset_params_get AssetFreeze", "defined_out": [ "check%4#0", @@ -17600,7 +18618,7 @@ "check%4#0" ] }, - "2671": { + "2855": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -17611,7 +18629,7 @@ "value%4#0" ] }, - "2672": { + "2856": { "op": "global ZeroAddress", "defined_out": [ "tmp%0#0", @@ -17630,7 +18648,7 @@ "tmp%2#0" ] }, - "2674": { + "2858": { "op": "!=", "defined_out": [ "tmp%0#0", @@ -17647,7 +18665,7 @@ "to_encode%0#0" ] }, - "2675": { + "2859": { "op": "pushbytes 0x00", "defined_out": [ "0x00", @@ -17666,7 +18684,7 @@ "0x00" ] }, - "2678": { + "2862": { "op": "intc_1 // 0", "stack_out": [ "tmp%0#0", @@ -17678,7 +18696,7 @@ "0" ] }, - "2679": { + "2863": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -17690,7 +18708,7 @@ "to_encode%0#0" ] }, - "2681": { + "2865": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -17707,7 +18725,7 @@ "encoded_bool%0#0" ] }, - "2682": { + "2866": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", @@ -17718,7 +18736,7 @@ "asset_id#0 (copy)" ] }, - "2684": { + "2868": { "op": "asset_params_get AssetClawback", "defined_out": [ "check%5#0", @@ -17739,7 +18757,7 @@ "check%5#0" ] }, - "2686": { + "2870": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -17751,7 +18769,7 @@ "value%5#0" ] }, - "2687": { + "2871": { "op": "global ZeroAddress", "defined_out": [ "encoded_bool%0#0", @@ -17772,7 +18790,7 @@ "tmp%3#0" ] }, - "2689": { + "2873": { "op": "!=", "defined_out": [ "encoded_bool%0#0", @@ -17791,7 +18809,7 @@ "to_encode%1#0" ] }, - "2690": { + "2874": { "op": "pushbytes 0x00", "stack_out": [ "tmp%0#0", @@ -17803,7 +18821,7 @@ "0x00" ] }, - "2693": { + "2877": { "op": "intc_1 // 0", "stack_out": [ "tmp%0#0", @@ -17816,7 +18834,7 @@ "0" ] }, - "2694": { + "2878": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -17829,7 +18847,7 @@ "to_encode%1#0" ] }, - "2696": { + "2880": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -17848,7 +18866,7 @@ "encoded_bool%1#0" ] }, - "2697": { + "2881": { "op": "frame_dig -1", "stack_out": [ "tmp%0#0", @@ -17860,7 +18878,7 @@ "asset_id#0 (copy)" ] }, - "2699": { + "2883": { "op": "itob", "defined_out": [ "encoded_bool%0#0", @@ -17881,7 +18899,7 @@ "tmp%4#0" ] }, - "2700": { + "2884": { "op": "dup", "defined_out": [ "encoded_bool%0#0", @@ -17903,7 +18921,7 @@ "tmp%4#0" ] }, - "2701": { + "2885": { "op": "box_len", "defined_out": [ "encoded_bool%0#0", @@ -17928,7 +18946,7 @@ "maybe_exists%0#0" ] }, - "2702": { + "2886": { "op": "bury 1", "stack_out": [ "tmp%0#0", @@ -17941,7 +18959,7 @@ "maybe_exists%0#0" ] }, - "2704": { + "2888": { "op": "bz _get_asset_small_ternary_false@2", "stack_out": [ "tmp%0#0", @@ -17953,7 +18971,7 @@ "tmp%4#0" ] }, - "2707": { + "2891": { "op": "frame_dig 6", "stack_out": [ "tmp%0#0", @@ -17966,7 +18984,7 @@ "tmp%4#0" ] }, - "2709": { + "2893": { "op": "box_get", "defined_out": [ "encoded_bool%0#0", @@ -17991,7 +19009,7 @@ "maybe_exists%1#0" ] }, - "2710": { + "2894": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "defined_out": [ @@ -18015,7 +19033,7 @@ "ternary_result%0#1" ] }, - "2711": { + "2895": { "block": "_get_asset_small_ternary_merge@3", "stack_in": [ "tmp%0#0", @@ -18043,7 +19061,7 @@ "tmp%0#0" ] }, - "2713": { + "2897": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -18062,7 +19080,7 @@ "tmp%0#0 (copy)" ] }, - "2714": { + "2898": { "op": "len", "defined_out": [ "data_length%0#0", @@ -18081,7 +19099,7 @@ "data_length%0#0" ] }, - "2715": { + "2899": { "op": "pushint 16 // 16", "defined_out": [ "16", @@ -18102,7 +19120,7 @@ "16" ] }, - "2717": { + "2901": { "op": "+", "defined_out": [ "current_tail_offset%1#0", @@ -18121,7 +19139,7 @@ "current_tail_offset%1#0" ] }, - "2718": { + "2902": { "op": "dup", "defined_out": [ "current_tail_offset%1#0", @@ -18142,7 +19160,7 @@ "current_tail_offset%1#0 (copy)" ] }, - "2719": { + "2903": { "op": "itob", "defined_out": [ "as_bytes%1#0", @@ -18163,7 +19181,7 @@ "as_bytes%1#0" ] }, - "2720": { + "2904": { "op": "extract 6 2", "defined_out": [ "current_tail_offset%1#0", @@ -18184,7 +19202,7 @@ "offset_as_uint16%1#0" ] }, - "2723": { + "2907": { "op": "pushbytes 0x0010", "defined_out": [ "0x0010", @@ -18207,7 +19225,7 @@ "0x0010" ] }, - "2727": { + "2911": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -18224,7 +19242,7 @@ "offset_as_uint16%1#0" ] }, - "2728": { + "2912": { "op": "concat", "defined_out": [ "current_tail_offset%1#0", @@ -18245,7 +19263,7 @@ "encoded_tuple_buffer%2#0" ] }, - "2729": { + "2913": { "op": "frame_dig 1", "defined_out": [ "current_tail_offset%1#0", @@ -18268,7 +19286,7 @@ "tmp%1#0" ] }, - "2731": { + "2915": { "op": "dup", "defined_out": [ "current_tail_offset%1#0", @@ -18293,7 +19311,7 @@ "tmp%1#0 (copy)" ] }, - "2732": { + "2916": { "op": "cover 3", "stack_out": [ "tmp%0#0", @@ -18311,7 +19329,7 @@ "tmp%1#0 (copy)" ] }, - "2734": { + "2918": { "op": "len", "defined_out": [ "current_tail_offset%1#0", @@ -18336,7 +19354,7 @@ "data_length%1#0" ] }, - "2735": { + "2919": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -18354,7 +19372,7 @@ "current_tail_offset%1#0" ] }, - "2737": { + "2921": { "op": "+", "defined_out": [ "current_tail_offset%2#0", @@ -18377,7 +19395,7 @@ "current_tail_offset%2#0" ] }, - "2738": { + "2922": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -18394,7 +19412,7 @@ "encoded_tuple_buffer%2#0" ] }, - "2739": { + "2923": { "op": "frame_dig 2", "defined_out": [ "current_tail_offset%2#0", @@ -18419,7 +19437,7 @@ "uint8%0#0" ] }, - "2741": { + "2925": { "op": "concat", "defined_out": [ "current_tail_offset%2#0", @@ -18443,7 +19461,7 @@ "encoded_tuple_buffer%3#0" ] }, - "2742": { + "2926": { "op": "frame_dig 3", "defined_out": [ "current_tail_offset%2#0", @@ -18469,7 +19487,7 @@ "val_as_bytes%1#0" ] }, - "2744": { + "2928": { "op": "concat", "defined_out": [ "current_tail_offset%2#0", @@ -18494,7 +19512,7 @@ "encoded_tuple_buffer%4#0" ] }, - "2745": { + "2929": { "op": "frame_dig 4", "defined_out": [ "current_tail_offset%2#0", @@ -18521,7 +19539,7 @@ "encoded_bool%0#0" ] }, - "2747": { + "2931": { "op": "concat", "defined_out": [ "current_tail_offset%2#0", @@ -18547,7 +19565,7 @@ "encoded_tuple_buffer%5#0" ] }, - "2748": { + "2932": { "op": "frame_dig 5", "defined_out": [ "current_tail_offset%2#0", @@ -18575,7 +19593,7 @@ "encoded_bool%1#0" ] }, - "2750": { + "2934": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -18605,7 +19623,7 @@ "0" ] }, - "2751": { + "2935": { "op": "getbit", "defined_out": [ "current_tail_offset%2#0", @@ -18634,10 +19652,10 @@ "is_true%0#0" ] }, - "2752": { + "2936": { "op": "pushint 105 // 105" }, - "2754": { + "2938": { "op": "swap", "defined_out": [ "105", @@ -18668,7 +19686,7 @@ "is_true%0#0" ] }, - "2755": { + "2939": { "op": "setbit", "defined_out": [ "current_tail_offset%2#0", @@ -18695,7 +19713,7 @@ "encoded_tuple_buffer%6#0" ] }, - "2756": { + "2940": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -18712,7 +19730,7 @@ "current_tail_offset%2#0" ] }, - "2757": { + "2941": { "op": "itob", "defined_out": [ "as_bytes%2#0", @@ -18739,7 +19757,7 @@ "as_bytes%2#0" ] }, - "2758": { + "2942": { "op": "extract 6 2", "defined_out": [ "encoded_bool%0#0", @@ -18766,7 +19784,7 @@ "offset_as_uint16%2#0" ] }, - "2761": { + "2945": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -18791,7 +19809,7 @@ "encoded_tuple_buffer%7#0" ] }, - "2762": { + "2946": { "op": "uncover 2", "stack_out": [ "tmp%0#0", @@ -18807,7 +19825,7 @@ "tmp%0#0" ] }, - "2764": { + "2948": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -18831,7 +19849,7 @@ "encoded_tuple_buffer%8#0" ] }, - "2765": { + "2949": { "op": "swap", "stack_out": [ "tmp%0#0", @@ -18846,7 +19864,7 @@ "tmp%1#0" ] }, - "2766": { + "2950": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -18869,7 +19887,7 @@ "encoded_tuple_buffer%9#0" ] }, - "2767": { + "2951": { "op": "swap", "defined_out": [ "encoded_bool%0#0", @@ -18893,7 +19911,7 @@ "ternary_result%0#1" ] }, - "2768": { + "2952": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -18915,14 +19933,14 @@ "encoded_tuple_buffer%10#0" ] }, - "2769": { + "2953": { "op": "frame_bury 0" }, - "2771": { + "2955": { "retsub": true, "op": "retsub" }, - "2772": { + "2956": { "block": "_get_asset_small_ternary_false@2", "stack_in": [ "tmp%0#0", @@ -18948,10 +19966,10 @@ "ternary_result%0#1" ] }, - "2773": { + "2957": { "op": "b _get_asset_small_ternary_merge@3" }, - "2776": { + "2960": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_small", "params": { "asset#0": "uint64" @@ -18960,7 +19978,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2779": { + "2963": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -18969,7 +19987,7 @@ "asset#0 (copy)" ] }, - "2781": { + "2965": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small", "op": "callsub _get_asset_small", "defined_out": [ @@ -18979,11 +19997,11 @@ "tmp%0#0" ] }, - "2784": { + "2968": { "retsub": true, "op": "retsub" }, - "2785": { + "2969": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_small", "params": { "assets#0": "bytes" @@ -18992,7 +20010,7 @@ "stack_in": [], "op": "proto 1 0" }, - "2788": { + "2972": { "op": "frame_dig -1", "defined_out": [ "assets#0 (copy)" @@ -19001,7 +20019,7 @@ "assets#0 (copy)" ] }, - "2790": { + "2974": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -19012,7 +20030,7 @@ "0" ] }, - "2791": { + "2975": { "op": "extract_uint16", "defined_out": [ "array_length%0#0" @@ -19021,7 +20039,7 @@ "array_length%0#0" ] }, - "2792": { + "2976": { "op": "intc_1 // 0", "defined_out": [ "_i#0", @@ -19032,7 +20050,7 @@ "_i#0" ] }, - "2793": { + "2977": { "block": "get_assets_small_for_header@1", "stack_in": [ "array_length%0#0", @@ -19048,7 +20066,7 @@ "_i#0" ] }, - "2795": { + "2979": { "op": "frame_dig 0", "defined_out": [ "_i#0", @@ -19061,7 +20079,7 @@ "array_length%0#0" ] }, - "2797": { + "2981": { "op": "<", "defined_out": [ "_i#0", @@ -19074,14 +20092,14 @@ "continue_looping%0#0" ] }, - "2798": { + "2982": { "op": "bz get_assets_small_after_for@4", "stack_out": [ "array_length%0#0", "_i#0" ] }, - "2801": { + "2985": { "op": "frame_dig -1", "defined_out": [ "_i#0", @@ -19094,7 +20112,7 @@ "assets#0 (copy)" ] }, - "2803": { + "2987": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -19107,7 +20125,7 @@ "array_head_and_tail%0#0" ] }, - "2806": { + "2990": { "op": "frame_dig 1", "stack_out": [ "array_length%0#0", @@ -19116,7 +20134,7 @@ "_i#0" ] }, - "2808": { + "2992": { "op": "dup", "defined_out": [ "_i#0", @@ -19132,7 +20150,7 @@ "_i#0 (copy)" ] }, - "2809": { + "2993": { "op": "cover 2", "stack_out": [ "array_length%0#0", @@ -19142,7 +20160,7 @@ "_i#0 (copy)" ] }, - "2811": { + "2995": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -19160,7 +20178,7 @@ "8" ] }, - "2812": { + "2996": { "op": "*", "defined_out": [ "_i#0", @@ -19176,7 +20194,7 @@ "item_offset%0#0" ] }, - "2813": { + "2997": { "op": "extract_uint64", "defined_out": [ "_i#0", @@ -19190,7 +20208,7 @@ "tmp%0#0" ] }, - "2814": { + "2998": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small", "op": "callsub _get_asset_small", "defined_out": [ @@ -19205,7 +20223,7 @@ "tmp%1#0" ] }, - "2817": { + "3001": { "op": "log", "stack_out": [ "array_length%0#0", @@ -19213,7 +20231,7 @@ "_i#0" ] }, - "2818": { + "3002": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -19227,7 +20245,7 @@ "1" ] }, - "2819": { + "3003": { "op": "+", "stack_out": [ "array_length%0#0", @@ -19235,7 +20253,7 @@ "_i#0" ] }, - "2820": { + "3004": { "op": "frame_bury 1", "defined_out": [ "_i#0", @@ -19246,10 +20264,10 @@ "_i#0" ] }, - "2822": { + "3006": { "op": "b get_assets_small_for_header@1" }, - "2825": { + "3009": { "block": "get_assets_small_after_for@4", "stack_in": [ "array_length%0#0", @@ -19258,7 +20276,7 @@ "retsub": true, "op": "retsub" }, - "2826": { + "3010": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full", "params": { "asset_id#0": "uint64" @@ -19267,13 +20285,13 @@ "stack_in": [], "op": "proto 1 1" }, - "2829": { + "3013": { "op": "intc_1 // 0", "stack_out": [ "encoded_value%0#0" ] }, - "2830": { + "3014": { "op": "dupn 11", "stack_out": [ "encoded_value%0#0", @@ -19290,7 +20308,7 @@ "value%9#0" ] }, - "2832": { + "3016": { "op": "frame_dig -1", "defined_out": [ "asset_id#0 (copy)" @@ -19311,7 +20329,7 @@ "asset_id#0 (copy)" ] }, - "2834": { + "3018": { "op": "asset_params_get AssetReserve", "defined_out": [ "check%0#0", @@ -19334,7 +20352,7 @@ "check%0#0" ] }, - "2836": { + "3020": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -19353,7 +20371,7 @@ "reserve_acct#0" ] }, - "2837": { + "3021": { "op": "dup", "stack_out": [ "encoded_value%0#0", @@ -19373,7 +20391,7 @@ "reserve_acct#0 (copy)" ] }, - "2838": { + "3022": { "op": "uncover 2", "defined_out": [ "check%0#0", @@ -19397,7 +20415,7 @@ "check%0#0" ] }, - "2840": { + "3024": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -19417,7 +20435,7 @@ "reserve_acct#0" ] }, - "2841": { + "3025": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -19437,7 +20455,7 @@ "asset_id#0 (copy)" ] }, - "2843": { + "3027": { "op": "asset_holding_get AssetBalance", "defined_out": [ "reserve_acct#0", @@ -19462,7 +20480,7 @@ "tmp%3#0" ] }, - "2845": { + "3029": { "op": "bury 1", "stack_out": [ "encoded_value%0#0", @@ -19481,7 +20499,7 @@ "tmp%3#0" ] }, - "2847": { + "3031": { "op": "bz _get_asset_full_ternary_false@2", "stack_out": [ "encoded_value%0#0", @@ -19499,7 +20517,7 @@ "reserve_acct#0" ] }, - "2850": { + "3034": { "op": "frame_dig 12", "stack_out": [ "encoded_value%0#0", @@ -19518,7 +20536,7 @@ "reserve_acct#0" ] }, - "2852": { + "3036": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -19538,7 +20556,7 @@ "asset_id#0 (copy)" ] }, - "2854": { + "3038": { "op": "asset_holding_get AssetBalance", "defined_out": [ "check%1#0", @@ -19563,7 +20581,7 @@ "check%1#0" ] }, - "2856": { + "3040": { "error": "account opted into asset", "op": "assert // account opted into asset", "defined_out": [ @@ -19587,7 +20605,7 @@ "reserve_balance#0" ] }, - "2857": { + "3041": { "block": "_get_asset_full_ternary_merge@3", "stack_in": [ "encoded_value%0#0", @@ -19627,7 +20645,7 @@ "asset_id#0 (copy)" ] }, - "2859": { + "3043": { "op": "asset_params_get AssetName", "defined_out": [ "check%2#0", @@ -19652,7 +20670,7 @@ "check%2#0" ] }, - "2861": { + "3045": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -19673,7 +20691,7 @@ "value%2#0" ] }, - "2862": { + "3046": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -19697,7 +20715,7 @@ "tmp%4#0" ] }, - "2865": { + "3049": { "op": "frame_bury 1", "defined_out": [ "tmp%4#0" @@ -19719,7 +20737,7 @@ "reserve_balance#0" ] }, - "2867": { + "3051": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -19739,7 +20757,7 @@ "asset_id#0 (copy)" ] }, - "2869": { + "3053": { "op": "asset_params_get AssetUnitName", "defined_out": [ "check%3#0", @@ -19765,7 +20783,7 @@ "check%3#0" ] }, - "2871": { + "3055": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -19786,7 +20804,7 @@ "value%3#0" ] }, - "2872": { + "3056": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -19811,7 +20829,7 @@ "tmp%5#0" ] }, - "2875": { + "3059": { "op": "frame_bury 2", "defined_out": [ "tmp%4#0", @@ -19834,7 +20852,7 @@ "reserve_balance#0" ] }, - "2877": { + "3061": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -19854,7 +20872,7 @@ "asset_id#0 (copy)" ] }, - "2879": { + "3063": { "op": "asset_params_get AssetURL", "defined_out": [ "check%4#0", @@ -19881,7 +20899,7 @@ "check%4#0" ] }, - "2881": { + "3065": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -19902,7 +20920,7 @@ "value%4#0" ] }, - "2882": { + "3066": { "callsub": "smart_contracts.asset_labeling.contract.b2str", "op": "callsub b2str", "defined_out": [ @@ -19928,7 +20946,7 @@ "tmp%6#0" ] }, - "2885": { + "3069": { "op": "frame_bury 3", "defined_out": [ "tmp%4#0", @@ -19952,7 +20970,7 @@ "reserve_balance#0" ] }, - "2887": { + "3071": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -19972,7 +20990,7 @@ "asset_id#0 (copy)" ] }, - "2889": { + "3073": { "op": "asset_params_get AssetTotal", "defined_out": [ "check%5#0", @@ -20000,7 +21018,7 @@ "check%5#0" ] }, - "2891": { + "3075": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -20021,7 +21039,7 @@ "value%5#0" ] }, - "2892": { + "3076": { "op": "itob", "defined_out": [ "tmp%4#0", @@ -20047,7 +21065,7 @@ "val_as_bytes%0#0" ] }, - "2893": { + "3077": { "op": "frame_bury 6", "defined_out": [ "tmp%4#0", @@ -20072,7 +21090,7 @@ "reserve_balance#0" ] }, - "2895": { + "3079": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -20092,7 +21110,7 @@ "asset_id#0 (copy)" ] }, - "2897": { + "3081": { "op": "asset_params_get AssetDecimals", "defined_out": [ "check%6#0", @@ -20121,7 +21139,7 @@ "check%6#0" ] }, - "2899": { + "3083": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -20142,7 +21160,7 @@ "value%6#0" ] }, - "2900": { + "3084": { "op": "itob", "defined_out": [ "tmp%4#0", @@ -20169,7 +21187,7 @@ "val_as_bytes%1#0" ] }, - "2901": { + "3085": { "op": "dup", "defined_out": [ "tmp%4#0", @@ -20198,7 +21216,7 @@ "val_as_bytes%1#0 (copy)" ] }, - "2902": { + "3086": { "op": "bitlen", "defined_out": [ "bitlen%0#0", @@ -20227,7 +21245,7 @@ "bitlen%0#0" ] }, - "2903": { + "3087": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -20258,7 +21276,7 @@ "8" ] }, - "2904": { + "3088": { "op": "<=", "defined_out": [ "no_overflow%0#0", @@ -20287,7 +21305,7 @@ "no_overflow%0#0" ] }, - "2905": { + "3089": { "error": "overflow", "op": "assert // overflow", "stack_out": [ @@ -20308,7 +21326,7 @@ "val_as_bytes%1#0" ] }, - "2906": { + "3090": { "op": "extract 7 1", "defined_out": [ "tmp%4#0", @@ -20335,7 +21353,7 @@ "uint8%0#0" ] }, - "2909": { + "3093": { "op": "frame_bury 5", "defined_out": [ "tmp%4#0", @@ -20361,7 +21379,7 @@ "reserve_balance#0" ] }, - "2911": { + "3095": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -20381,7 +21399,7 @@ "asset_id#0 (copy)" ] }, - "2913": { + "3097": { "op": "asset_params_get AssetManager", "defined_out": [ "check%7#0", @@ -20411,7 +21429,7 @@ "check%7#0" ] }, - "2915": { + "3099": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -20432,7 +21450,7 @@ "value%7#0" ] }, - "2916": { + "3100": { "op": "frame_bury 9", "defined_out": [ "check%7#0", @@ -20461,7 +21479,7 @@ "check%7#0" ] }, - "2918": { + "3102": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -20481,7 +21499,7 @@ "reserve_balance#0" ] }, - "2919": { + "3103": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -20501,7 +21519,7 @@ "asset_id#0 (copy)" ] }, - "2921": { + "3105": { "op": "asset_params_get AssetFreeze", "defined_out": [ "check%8#0", @@ -20532,7 +21550,7 @@ "check%8#0" ] }, - "2923": { + "3107": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -20553,7 +21571,7 @@ "value%8#0" ] }, - "2924": { + "3108": { "op": "frame_bury 10", "stack_out": [ "encoded_value%0#0", @@ -20573,7 +21591,7 @@ "check%8#0" ] }, - "2926": { + "3110": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -20593,7 +21611,7 @@ "reserve_balance#0" ] }, - "2927": { + "3111": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -20613,7 +21631,7 @@ "asset_id#0 (copy)" ] }, - "2929": { + "3113": { "op": "asset_params_get AssetClawback", "defined_out": [ "check%9#0", @@ -20645,7 +21663,7 @@ "check%9#0" ] }, - "2931": { + "3115": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -20666,7 +21684,7 @@ "value%9#0" ] }, - "2932": { + "3116": { "op": "frame_bury 11", "defined_out": [ "check%9#0", @@ -20697,7 +21715,7 @@ "check%9#0" ] }, - "2934": { + "3118": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -20717,7 +21735,7 @@ "reserve_balance#0" ] }, - "2935": { + "3119": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -20737,7 +21755,7 @@ "asset_id#0 (copy)" ] }, - "2937": { + "3121": { "op": "asset_params_get AssetReserve", "defined_out": [ "check%10#0", @@ -20770,7 +21788,7 @@ "check%10#0" ] }, - "2939": { + "3123": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -20791,7 +21809,7 @@ "value%10#0" ] }, - "2940": { + "3124": { "op": "frame_bury 8", "defined_out": [ "check%10#0", @@ -20823,7 +21841,7 @@ "check%10#0" ] }, - "2942": { + "3126": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -20843,7 +21861,7 @@ "reserve_balance#0" ] }, - "2943": { + "3127": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -20863,7 +21881,7 @@ "asset_id#0 (copy)" ] }, - "2945": { + "3129": { "op": "asset_params_get AssetMetadataHash", "defined_out": [ "check%11#0", @@ -20897,7 +21915,7 @@ "check%11#0" ] }, - "2947": { + "3131": { "error": "asset exists", "op": "assert // asset exists", "stack_out": [ @@ -20918,7 +21936,7 @@ "value%11#0" ] }, - "2948": { + "3132": { "op": "dup", "defined_out": [ "tmp%4#0", @@ -20952,7 +21970,7 @@ "value%11#0 (copy)" ] }, - "2949": { + "3133": { "op": "len", "defined_out": [ "length%0#0", @@ -20986,7 +22004,7 @@ "length%0#0" ] }, - "2950": { + "3134": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -21020,7 +22038,7 @@ "as_bytes%0#0" ] }, - "2951": { + "3135": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0", @@ -21054,7 +22072,7 @@ "length_uint16%0#0" ] }, - "2954": { + "3138": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -21075,7 +22093,7 @@ "value%11#0" ] }, - "2955": { + "3139": { "op": "concat", "defined_out": [ "encoded_value%0#0", @@ -21107,7 +22125,7 @@ "encoded_value%0#0" ] }, - "2956": { + "3140": { "op": "frame_bury 0", "defined_out": [ "encoded_value%0#0", @@ -21139,7 +22157,7 @@ "reserve_balance#0" ] }, - "2958": { + "3142": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -21171,7 +22189,7 @@ "val_as_bytes%2#0" ] }, - "2959": { + "3143": { "op": "frame_bury 7", "defined_out": [ "encoded_value%0#0", @@ -21202,7 +22220,7 @@ "reserve_acct#0" ] }, - "2961": { + "3145": { "op": "frame_dig -1", "stack_out": [ "encoded_value%0#0", @@ -21221,7 +22239,7 @@ "asset_id#0 (copy)" ] }, - "2963": { + "3147": { "op": "itob", "defined_out": [ "encoded_value%0#0", @@ -21254,7 +22272,7 @@ "tmp%7#0" ] }, - "2964": { + "3148": { "op": "dup", "stack_out": [ "encoded_value%0#0", @@ -21274,7 +22292,7 @@ "tmp%7#0" ] }, - "2965": { + "3149": { "op": "frame_bury 4", "stack_out": [ "encoded_value%0#0", @@ -21293,7 +22311,7 @@ "tmp%7#0" ] }, - "2967": { + "3151": { "op": "box_len", "defined_out": [ "encoded_value%0#0", @@ -21329,7 +22347,7 @@ "maybe_exists%0#0" ] }, - "2968": { + "3152": { "op": "bury 1", "stack_out": [ "encoded_value%0#0", @@ -21348,7 +22366,7 @@ "maybe_exists%0#0" ] }, - "2970": { + "3154": { "op": "bz _get_asset_full_ternary_false@5", "stack_out": [ "encoded_value%0#0", @@ -21366,7 +22384,7 @@ "reserve_acct#0" ] }, - "2973": { + "3157": { "op": "frame_dig 4", "stack_out": [ "encoded_value%0#0", @@ -21385,7 +22403,7 @@ "tmp%7#0" ] }, - "2975": { + "3159": { "op": "box_get", "defined_out": [ "encoded_value%0#0", @@ -21421,7 +22439,7 @@ "maybe_exists%1#0" ] }, - "2976": { + "3160": { "error": "check self.assets entry exists", "op": "assert // check self.assets entry exists", "defined_out": [ @@ -21456,7 +22474,7 @@ "ternary_result%1#1" ] }, - "2977": { + "3161": { "block": "_get_asset_full_ternary_merge@6", "stack_in": [ "encoded_value%0#0", @@ -21496,7 +22514,7 @@ "tmp%4#0" ] }, - "2979": { + "3163": { "op": "dup", "defined_out": [ "tmp%4#0", @@ -21521,7 +22539,7 @@ "tmp%4#0 (copy)" ] }, - "2980": { + "3164": { "op": "len", "defined_out": [ "data_length%0#0", @@ -21546,7 +22564,7 @@ "data_length%0#0" ] }, - "2981": { + "3165": { "op": "pushint 155 // 155", "defined_out": [ "155", @@ -21573,7 +22591,7 @@ "155" ] }, - "2984": { + "3168": { "op": "+", "defined_out": [ "current_tail_offset%1#0", @@ -21598,7 +22616,7 @@ "current_tail_offset%1#0" ] }, - "2985": { + "3169": { "op": "dup", "defined_out": [ "current_tail_offset%1#0", @@ -21625,7 +22643,7 @@ "current_tail_offset%1#0 (copy)" ] }, - "2986": { + "3170": { "op": "itob", "defined_out": [ "as_bytes%2#0", @@ -21652,7 +22670,7 @@ "as_bytes%2#0" ] }, - "2987": { + "3171": { "op": "extract 6 2", "defined_out": [ "current_tail_offset%1#0", @@ -21679,7 +22697,7 @@ "offset_as_uint16%1#0" ] }, - "2990": { + "3174": { "op": "pushbytes 0x009b", "defined_out": [ "0x009b", @@ -21708,7 +22726,7 @@ "0x009b" ] }, - "2994": { + "3178": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -21731,7 +22749,7 @@ "offset_as_uint16%1#0" ] }, - "2995": { + "3179": { "op": "concat", "defined_out": [ "current_tail_offset%1#0", @@ -21758,7 +22776,7 @@ "encoded_tuple_buffer%2#0" ] }, - "2996": { + "3180": { "op": "frame_dig 2", "defined_out": [ "current_tail_offset%1#0", @@ -21787,7 +22805,7 @@ "tmp%5#0" ] }, - "2998": { + "3182": { "op": "dup", "defined_out": [ "current_tail_offset%1#0", @@ -21818,7 +22836,7 @@ "tmp%5#0 (copy)" ] }, - "2999": { + "3183": { "op": "cover 3", "stack_out": [ "encoded_value%0#0", @@ -21842,7 +22860,7 @@ "tmp%5#0 (copy)" ] }, - "3001": { + "3185": { "op": "len", "defined_out": [ "current_tail_offset%1#0", @@ -21873,7 +22891,7 @@ "data_length%1#0" ] }, - "3002": { + "3186": { "op": "uncover 2", "stack_out": [ "encoded_value%0#0", @@ -21897,7 +22915,7 @@ "current_tail_offset%1#0" ] }, - "3004": { + "3188": { "op": "+", "defined_out": [ "current_tail_offset%2#0", @@ -21926,7 +22944,7 @@ "current_tail_offset%2#0" ] }, - "3005": { + "3189": { "op": "dup", "defined_out": [ "current_tail_offset%2#0", @@ -21957,7 +22975,7 @@ "current_tail_offset%2#0 (copy)" ] }, - "3006": { + "3190": { "op": "itob", "defined_out": [ "as_bytes%3#0", @@ -21988,7 +23006,7 @@ "as_bytes%3#0" ] }, - "3007": { + "3191": { "op": "extract 6 2", "defined_out": [ "current_tail_offset%2#0", @@ -22019,7 +23037,7 @@ "offset_as_uint16%2#0" ] }, - "3010": { + "3194": { "op": "uncover 2", "stack_out": [ "encoded_value%0#0", @@ -22043,7 +23061,7 @@ "encoded_tuple_buffer%2#0" ] }, - "3012": { + "3196": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -22067,7 +23085,7 @@ "offset_as_uint16%2#0" ] }, - "3013": { + "3197": { "op": "concat", "defined_out": [ "current_tail_offset%2#0", @@ -22096,7 +23114,7 @@ "encoded_tuple_buffer%3#0" ] }, - "3014": { + "3198": { "op": "frame_dig 3", "defined_out": [ "current_tail_offset%2#0", @@ -22127,7 +23145,7 @@ "tmp%6#0" ] }, - "3016": { + "3200": { "op": "dup", "defined_out": [ "current_tail_offset%2#0", @@ -22160,7 +23178,7 @@ "tmp%6#0 (copy)" ] }, - "3017": { + "3201": { "op": "cover 3", "stack_out": [ "encoded_value%0#0", @@ -22185,7 +23203,7 @@ "tmp%6#0 (copy)" ] }, - "3019": { + "3203": { "op": "len", "defined_out": [ "current_tail_offset%2#0", @@ -22218,7 +23236,7 @@ "data_length%2#0" ] }, - "3020": { + "3204": { "op": "uncover 2", "stack_out": [ "encoded_value%0#0", @@ -22243,7 +23261,7 @@ "current_tail_offset%2#0" ] }, - "3022": { + "3206": { "op": "+", "defined_out": [ "current_tail_offset%3#0", @@ -22274,7 +23292,7 @@ "current_tail_offset%3#0" ] }, - "3023": { + "3207": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -22298,7 +23316,7 @@ "encoded_tuple_buffer%3#0" ] }, - "3024": { + "3208": { "op": "frame_dig 6", "defined_out": [ "current_tail_offset%3#0", @@ -22331,7 +23349,7 @@ "val_as_bytes%0#0" ] }, - "3026": { + "3210": { "op": "concat", "defined_out": [ "current_tail_offset%3#0", @@ -22363,7 +23381,7 @@ "encoded_tuple_buffer%4#0" ] }, - "3027": { + "3211": { "op": "frame_dig 5", "defined_out": [ "current_tail_offset%3#0", @@ -22397,7 +23415,7 @@ "uint8%0#0" ] }, - "3029": { + "3213": { "op": "concat", "defined_out": [ "current_tail_offset%3#0", @@ -22430,7 +23448,7 @@ "encoded_tuple_buffer%5#0" ] }, - "3030": { + "3214": { "op": "frame_dig 9", "defined_out": [ "current_tail_offset%3#0", @@ -22465,7 +23483,7 @@ "value%7#0" ] }, - "3032": { + "3216": { "op": "concat", "defined_out": [ "current_tail_offset%3#0", @@ -22499,7 +23517,7 @@ "encoded_tuple_buffer%6#0" ] }, - "3033": { + "3217": { "op": "frame_dig 10", "defined_out": [ "current_tail_offset%3#0", @@ -22535,7 +23553,7 @@ "value%8#0" ] }, - "3035": { + "3219": { "op": "concat", "defined_out": [ "current_tail_offset%3#0", @@ -22570,7 +23588,7 @@ "encoded_tuple_buffer%7#0" ] }, - "3036": { + "3220": { "op": "frame_dig 11", "defined_out": [ "current_tail_offset%3#0", @@ -22607,7 +23625,7 @@ "value%9#0" ] }, - "3038": { + "3222": { "op": "concat", "defined_out": [ "current_tail_offset%3#0", @@ -22643,7 +23661,7 @@ "encoded_tuple_buffer%8#0" ] }, - "3039": { + "3223": { "op": "frame_dig 8", "defined_out": [ "current_tail_offset%3#0", @@ -22681,7 +23699,7 @@ "value%10#0" ] }, - "3041": { + "3225": { "op": "concat", "defined_out": [ "current_tail_offset%3#0", @@ -22718,7 +23736,7 @@ "encoded_tuple_buffer%9#0" ] }, - "3042": { + "3226": { "op": "dig 1", "defined_out": [ "current_tail_offset%3#0", @@ -22757,7 +23775,7 @@ "current_tail_offset%3#0 (copy)" ] }, - "3044": { + "3228": { "op": "itob", "defined_out": [ "as_bytes%4#0", @@ -22796,7 +23814,7 @@ "as_bytes%4#0" ] }, - "3045": { + "3229": { "op": "extract 6 2", "defined_out": [ "current_tail_offset%3#0", @@ -22835,7 +23853,7 @@ "offset_as_uint16%3#0" ] }, - "3048": { + "3232": { "op": "concat", "defined_out": [ "current_tail_offset%3#0", @@ -22872,7 +23890,7 @@ "encoded_tuple_buffer%10#0" ] }, - "3049": { + "3233": { "op": "frame_dig 0", "defined_out": [ "current_tail_offset%3#0", @@ -22911,7 +23929,7 @@ "encoded_value%0#0" ] }, - "3051": { + "3235": { "op": "dup", "defined_out": [ "current_tail_offset%3#0", @@ -22952,7 +23970,7 @@ "encoded_value%0#0 (copy)" ] }, - "3052": { + "3236": { "op": "cover 3", "stack_out": [ "encoded_value%0#0", @@ -22978,7 +23996,7 @@ "encoded_value%0#0 (copy)" ] }, - "3054": { + "3238": { "op": "len", "defined_out": [ "current_tail_offset%3#0", @@ -23019,7 +24037,7 @@ "data_length%3#0" ] }, - "3055": { + "3239": { "op": "uncover 2", "stack_out": [ "encoded_value%0#0", @@ -23045,7 +24063,7 @@ "current_tail_offset%3#0" ] }, - "3057": { + "3241": { "op": "+", "defined_out": [ "current_tail_offset%4#0", @@ -23084,7 +24102,7 @@ "current_tail_offset%4#0" ] }, - "3058": { + "3242": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -23109,7 +24127,7 @@ "encoded_tuple_buffer%10#0" ] }, - "3059": { + "3243": { "op": "frame_dig 7", "defined_out": [ "current_tail_offset%4#0", @@ -23150,7 +24168,7 @@ "val_as_bytes%2#0" ] }, - "3061": { + "3245": { "op": "concat", "defined_out": [ "current_tail_offset%4#0", @@ -23190,7 +24208,7 @@ "encoded_tuple_buffer%11#0" ] }, - "3062": { + "3246": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -23215,7 +24233,7 @@ "current_tail_offset%4#0" ] }, - "3063": { + "3247": { "op": "itob", "defined_out": [ "as_bytes%5#0", @@ -23255,7 +24273,7 @@ "as_bytes%5#0" ] }, - "3064": { + "3248": { "op": "extract 6 2", "defined_out": [ "encoded_tuple_buffer%11#0", @@ -23295,7 +24313,7 @@ "offset_as_uint16%4#0" ] }, - "3067": { + "3251": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%12#0", @@ -23333,7 +24351,7 @@ "encoded_tuple_buffer%12#0" ] }, - "3068": { + "3252": { "op": "uncover 4", "stack_out": [ "encoded_value%0#0", @@ -23357,7 +24375,7 @@ "tmp%4#0" ] }, - "3070": { + "3254": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%13#0", @@ -23394,7 +24412,7 @@ "encoded_tuple_buffer%13#0" ] }, - "3071": { + "3255": { "op": "uncover 3", "stack_out": [ "encoded_value%0#0", @@ -23417,7 +24435,7 @@ "tmp%5#0" ] }, - "3073": { + "3257": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%14#0", @@ -23453,7 +24471,7 @@ "encoded_tuple_buffer%14#0" ] }, - "3074": { + "3258": { "op": "uncover 2", "stack_out": [ "encoded_value%0#0", @@ -23475,7 +24493,7 @@ "tmp%6#0" ] }, - "3076": { + "3260": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%15#0", @@ -23510,7 +24528,7 @@ "encoded_tuple_buffer%15#0" ] }, - "3077": { + "3261": { "op": "swap", "stack_out": [ "encoded_value%0#0", @@ -23531,7 +24549,7 @@ "encoded_value%0#0" ] }, - "3078": { + "3262": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%16#0", @@ -23565,7 +24583,7 @@ "encoded_tuple_buffer%16#0" ] }, - "3079": { + "3263": { "op": "swap", "defined_out": [ "encoded_tuple_buffer%16#0", @@ -23600,7 +24618,7 @@ "ternary_result%1#1" ] }, - "3080": { + "3264": { "op": "concat", "defined_out": [ "encoded_tuple_buffer%17#0", @@ -23633,14 +24651,14 @@ "encoded_tuple_buffer%17#0" ] }, - "3081": { + "3265": { "op": "frame_bury 0" }, - "3083": { + "3267": { "retsub": true, "op": "retsub" }, - "3084": { + "3268": { "block": "_get_asset_full_ternary_false@5", "stack_in": [ "encoded_value%0#0", @@ -23678,10 +24696,10 @@ "ternary_result%1#1" ] }, - "3085": { + "3269": { "op": "b _get_asset_full_ternary_merge@6" }, - "3088": { + "3272": { "block": "_get_asset_full_ternary_false@2", "stack_in": [ "encoded_value%0#0", @@ -23719,10 +24737,10 @@ "reserve_balance#0" ] }, - "3089": { + "3273": { "op": "b _get_asset_full_ternary_merge@3" }, - "3092": { + "3276": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_full", "params": { "asset#0": "uint64" @@ -23731,7 +24749,7 @@ "stack_in": [], "op": "proto 1 1" }, - "3095": { + "3279": { "op": "frame_dig -1", "defined_out": [ "asset#0 (copy)" @@ -23740,7 +24758,7 @@ "asset#0 (copy)" ] }, - "3097": { + "3281": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full", "op": "callsub _get_asset_full", "defined_out": [ @@ -23750,11 +24768,11 @@ "tmp%0#0" ] }, - "3100": { + "3284": { "retsub": true, "op": "retsub" }, - "3101": { + "3285": { "subroutine": "smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_full", "params": { "assets#0": "bytes" @@ -23763,7 +24781,7 @@ "stack_in": [], "op": "proto 1 0" }, - "3104": { + "3288": { "op": "frame_dig -1", "defined_out": [ "assets#0 (copy)" @@ -23772,7 +24790,7 @@ "assets#0 (copy)" ] }, - "3106": { + "3290": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -23783,7 +24801,7 @@ "0" ] }, - "3107": { + "3291": { "op": "extract_uint16", "defined_out": [ "array_length%0#0" @@ -23792,7 +24810,7 @@ "array_length%0#0" ] }, - "3108": { + "3292": { "op": "intc_1 // 0", "defined_out": [ "_i#0", @@ -23803,7 +24821,7 @@ "_i#0" ] }, - "3109": { + "3293": { "block": "get_assets_full_for_header@1", "stack_in": [ "array_length%0#0", @@ -23819,7 +24837,7 @@ "_i#0" ] }, - "3111": { + "3295": { "op": "frame_dig 0", "defined_out": [ "_i#0", @@ -23832,7 +24850,7 @@ "array_length%0#0" ] }, - "3113": { + "3297": { "op": "<", "defined_out": [ "_i#0", @@ -23845,14 +24863,14 @@ "continue_looping%0#0" ] }, - "3114": { + "3298": { "op": "bz get_assets_full_after_for@4", "stack_out": [ "array_length%0#0", "_i#0" ] }, - "3117": { + "3301": { "op": "frame_dig -1", "defined_out": [ "_i#0", @@ -23865,7 +24883,7 @@ "assets#0 (copy)" ] }, - "3119": { + "3303": { "op": "extract 2 0", "defined_out": [ "_i#0", @@ -23878,7 +24896,7 @@ "array_head_and_tail%0#0" ] }, - "3122": { + "3306": { "op": "frame_dig 1", "stack_out": [ "array_length%0#0", @@ -23887,7 +24905,7 @@ "_i#0" ] }, - "3124": { + "3308": { "op": "dup", "defined_out": [ "_i#0", @@ -23903,7 +24921,7 @@ "_i#0 (copy)" ] }, - "3125": { + "3309": { "op": "cover 2", "stack_out": [ "array_length%0#0", @@ -23913,7 +24931,7 @@ "_i#0 (copy)" ] }, - "3127": { + "3311": { "op": "intc_3 // 8", "defined_out": [ "8", @@ -23931,7 +24949,7 @@ "8" ] }, - "3128": { + "3312": { "op": "*", "defined_out": [ "_i#0", @@ -23947,7 +24965,7 @@ "item_offset%0#0" ] }, - "3129": { + "3313": { "op": "extract_uint64", "defined_out": [ "_i#0", @@ -23961,7 +24979,7 @@ "tmp%0#0" ] }, - "3130": { + "3314": { "callsub": "smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full", "op": "callsub _get_asset_full", "defined_out": [ @@ -23976,7 +24994,7 @@ "tmp%1#0" ] }, - "3133": { + "3317": { "op": "log", "stack_out": [ "array_length%0#0", @@ -23984,7 +25002,7 @@ "_i#0" ] }, - "3134": { + "3318": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -23998,7 +25016,7 @@ "1" ] }, - "3135": { + "3319": { "op": "+", "stack_out": [ "array_length%0#0", @@ -24006,7 +25024,7 @@ "_i#0" ] }, - "3136": { + "3320": { "op": "frame_bury 1", "defined_out": [ "_i#0", @@ -24017,10 +25035,10 @@ "_i#0" ] }, - "3138": { + "3322": { "op": "b get_assets_full_for_header@1" }, - "3141": { + "3325": { "block": "get_assets_full_after_for@4", "stack_in": [ "array_length%0#0", diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal index 5a5f331..9695c2a 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.approval.teal @@ -4,60 +4,60 @@ // smart_contracts.asset_labeling.contract.AssetLabeling.__algopy_entrypoint_with_init() -> uint64: main: intcblock 1 0 2 8 4294967295 4294967296 - bytecblock 0x151f7c75 "ERR:NOEXIST" 0x0000 "" "admin" "ERR:EXISTS" 0x0002 "ERR:UNAUTH" "ERR:LENGTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0001 + bytecblock 0x151f7c75 "ERR:NOEXIST" 0x0000 "" "admin" "ERR:EXISTS" 0x0002 "ERR:UNAUTH" 0x0000000000000000 "ERR:NOEMPTY" 0x0001 txn ApplicationID bnz main_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:53 + // smart_contracts/asset_labeling/contract.py:57 // self.admin = Txn.sender bytec 4 // "admin" txn Sender app_global_put main_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txn NumAppArgs - bz main_bare_routing@27 - pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0x4f53c25d 0x5540b80a 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]", method "get_asset_micro(uint64)(string,uint8)", method "get_assets_micro(uint64[])void", method "get_asset_micro_labels(uint64)(string,uint8,string[])", method "get_assets_micro_labels(uint64[])void", method "get_asset_text(uint64)(string,string,string[],string)", method "get_assets_text(uint64[])void", method "get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])", method "get_assets_small(uint64[])void", method "get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])", method "get_assets_full(uint64[])void" + bz main_bare_routing@29 + pushbytess 0x8f0d7d8e 0x7c1b32f6 0x17e691ae 0x33d0ffdc 0x725616e7 0xfac1cf1b 0xb4c50b9f 0xa2dd2247 0xa37dea11 0x68f18efa 0xc2ed743f 0xa67f03c2 0xaaee0c61 0xb6c39f68 0x635be362 0x7093b10d 0xe1bb95fc 0x5540b80a 0x8a412f93 0x6f17cdd5 0x7a4ce4b9 0x366c51af 0xd5d3bad3 0x03ba98db // method "change_admin(account)void", method "add_label(string,string)void", method "remove_label(string)void", method "get_label(string)(string,uint64,uint64)", method "log_labels(string[])void", method "add_operator_to_label(account,string)void", method "remove_operator_from_label(account,string)void", method "get_operator_labels(account)string[]", method "add_label_to_asset(string,asset)void", method "remove_label_from_asset(string,asset)void", method "get_asset_labels(asset)string[]", method "get_assets_labels(uint64[])string[][]", method "get_asset_micro(uint64)(string,uint8)", method "get_assets_micro(uint64[])void", method "get_asset_micro_labels(uint64)(string,uint8,string[])", method "get_assets_micro_labels(uint64[])void", method "get_asset_text(uint64)(string,string,string,string[])", method "get_assets_text(uint64[])void", method "get_asset_text_labels(uint64)(string,string,string)", method "get_assets_text_labels(uint64[])void", method "get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])", method "get_assets_small(uint64[])void", method "get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])", method "get_assets_full(uint64[])void" txna ApplicationArgs 0 - match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 main_get_asset_micro_labels_route@19 main_get_assets_micro_labels_route@20 main_get_asset_text_route@21 main_get_assets_text_route@22 main_get_asset_small_route@23 main_get_assets_small_route@24 main_get_asset_full_route@25 main_get_assets_full_route@26 + match main_change_admin_route@5 main_add_label_route@6 main_remove_label_route@7 main_get_label_route@8 main_log_labels_route@9 main_add_operator_to_label_route@10 main_remove_operator_from_label_route@11 main_get_operator_labels_route@12 main_add_label_to_asset_route@13 main_remove_label_from_asset_route@14 main_get_asset_labels_route@15 main_get_assets_labels_route@16 main_get_asset_micro_route@17 main_get_assets_micro_route@18 main_get_asset_micro_labels_route@19 main_get_assets_micro_labels_route@20 main_get_asset_text_route@21 main_get_assets_text_route@22 main_get_asset_text_labels_route@23 main_get_assets_text_labels_route@24 main_get_asset_small_route@25 main_get_assets_small_route@26 main_get_asset_full_route@27 main_get_assets_full_route@28 -main_after_if_else@29: - // smart_contracts/asset_labeling/contract.py:51 +main_after_if_else@33: + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): intc_1 // 0 return -main_get_assets_full_route@26: - // smart_contracts/asset_labeling/contract.py:408 +main_get_assets_full_route@28: + // smart_contracts/asset_labeling/contract.py:441 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:408 + // smart_contracts/asset_labeling/contract.py:441 // @abimethod(readonly=True) callsub get_assets_full intc_0 // 1 return -main_get_asset_full_route@25: - // smart_contracts/asset_labeling/contract.py:404 +main_get_asset_full_route@27: + // smart_contracts/asset_labeling/contract.py:437 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi - // smart_contracts/asset_labeling/contract.py:404 + // smart_contracts/asset_labeling/contract.py:437 // @abimethod(readonly=True) callsub get_asset_full bytec_0 // 0x151f7c75 @@ -67,36 +67,36 @@ main_get_asset_full_route@25: intc_0 // 1 return -main_get_assets_small_route@24: - // smart_contracts/asset_labeling/contract.py:373 +main_get_assets_small_route@26: + // smart_contracts/asset_labeling/contract.py:406 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:373 + // smart_contracts/asset_labeling/contract.py:406 // @abimethod(readonly=True) callsub get_assets_small intc_0 // 1 return -main_get_asset_small_route@23: - // smart_contracts/asset_labeling/contract.py:369 +main_get_asset_small_route@25: + // smart_contracts/asset_labeling/contract.py:402 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi - // smart_contracts/asset_labeling/contract.py:369 + // smart_contracts/asset_labeling/contract.py:402 // @abimethod(readonly=True) callsub get_asset_small bytec_0 // 0x151f7c75 @@ -106,36 +106,75 @@ main_get_asset_small_route@23: intc_0 // 1 return +main_get_assets_text_labels_route@24: + // smart_contracts/asset_labeling/contract.py:382 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:55 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/asset_labeling/contract.py:382 + // @abimethod(readonly=True) + callsub get_assets_text_labels + intc_0 // 1 + return + +main_get_asset_text_labels_route@23: + // smart_contracts/asset_labeling/contract.py:378 + // @abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/asset_labeling/contract.py:55 + // class AssetLabeling(ARC4Contract): + txna ApplicationArgs 1 + btoi + // smart_contracts/asset_labeling/contract.py:378 + // @abimethod(readonly=True) + callsub get_asset_text_labels + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + main_get_assets_text_route@22: - // smart_contracts/asset_labeling/contract.py:349 + // smart_contracts/asset_labeling/contract.py:362 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:349 + // smart_contracts/asset_labeling/contract.py:362 // @abimethod(readonly=True) callsub get_assets_text intc_0 // 1 return main_get_asset_text_route@21: - // smart_contracts/asset_labeling/contract.py:345 + // smart_contracts/asset_labeling/contract.py:358 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi - // smart_contracts/asset_labeling/contract.py:345 + // smart_contracts/asset_labeling/contract.py:358 // @abimethod(readonly=True) callsub get_asset_text bytec_0 // 0x151f7c75 @@ -146,35 +185,35 @@ main_get_asset_text_route@21: return main_get_assets_micro_labels_route@20: - // smart_contracts/asset_labeling/contract.py:328 + // smart_contracts/asset_labeling/contract.py:341 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:328 + // smart_contracts/asset_labeling/contract.py:341 // @abimethod(readonly=True) callsub get_assets_micro_labels intc_0 // 1 return main_get_asset_micro_labels_route@19: - // smart_contracts/asset_labeling/contract.py:324 + // smart_contracts/asset_labeling/contract.py:337 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi - // smart_contracts/asset_labeling/contract.py:324 + // smart_contracts/asset_labeling/contract.py:337 // @abimethod(readonly=True) callsub get_asset_micro_labels bytec_0 // 0x151f7c75 @@ -185,35 +224,35 @@ main_get_asset_micro_labels_route@19: return main_get_assets_micro_route@18: - // smart_contracts/asset_labeling/contract.py:308 + // smart_contracts/asset_labeling/contract.py:321 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:308 + // smart_contracts/asset_labeling/contract.py:321 // @abimethod(readonly=True) callsub get_assets_micro intc_0 // 1 return main_get_asset_micro_route@17: - // smart_contracts/asset_labeling/contract.py:304 + // smart_contracts/asset_labeling/contract.py:317 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi - // smart_contracts/asset_labeling/contract.py:304 + // smart_contracts/asset_labeling/contract.py:317 // @abimethod(readonly=True) callsub get_asset_micro bytec_0 // 0x151f7c75 @@ -224,17 +263,17 @@ main_get_asset_micro_route@17: return main_get_assets_labels_route@16: - // smart_contracts/asset_labeling/contract.py:277 + // smart_contracts/asset_labeling/contract.py:290 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:277 + // smart_contracts/asset_labeling/contract.py:290 // @abimethod(readonly=True) callsub get_assets_labels bytec_0 // 0x151f7c75 @@ -245,19 +284,19 @@ main_get_assets_labels_route@16: return main_get_asset_labels_route@15: - // smart_contracts/asset_labeling/contract.py:270 + // smart_contracts/asset_labeling/contract.py:283 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:270 + // smart_contracts/asset_labeling/contract.py:283 // @abimethod(readonly=True) callsub get_asset_labels bytec_0 // 0x151f7c75 @@ -268,61 +307,61 @@ main_get_asset_labels_route@15: return main_remove_label_from_asset_route@14: - // smart_contracts/asset_labeling/contract.py:236 + // smart_contracts/asset_labeling/contract.py:249 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:236 + // smart_contracts/asset_labeling/contract.py:249 // @abimethod() callsub remove_label_from_asset intc_0 // 1 return main_add_label_to_asset_route@13: - // smart_contracts/asset_labeling/contract.py:208 + // smart_contracts/asset_labeling/contract.py:221 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi txnas Assets - // smart_contracts/asset_labeling/contract.py:208 + // smart_contracts/asset_labeling/contract.py:221 // @abimethod() callsub add_label_to_asset intc_0 // 1 return main_get_operator_labels_route@12: - // smart_contracts/asset_labeling/contract.py:192 + // smart_contracts/asset_labeling/contract.py:205 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts - // smart_contracts/asset_labeling/contract.py:192 + // smart_contracts/asset_labeling/contract.py:205 // @abimethod(readonly=True) callsub get_operator_labels bytec_0 // 0x151f7c75 @@ -333,77 +372,77 @@ main_get_operator_labels_route@12: return main_remove_operator_from_label_route@11: - // smart_contracts/asset_labeling/contract.py:151 + // smart_contracts/asset_labeling/contract.py:164 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:151 + // smart_contracts/asset_labeling/contract.py:164 // @abimethod() callsub remove_operator_from_label intc_0 // 1 return main_add_operator_to_label_route@10: - // smart_contracts/asset_labeling/contract.py:123 + // smart_contracts/asset_labeling/contract.py:136 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:123 + // smart_contracts/asset_labeling/contract.py:136 // @abimethod() callsub add_operator_to_label intc_0 // 1 return main_log_labels_route@9: - // smart_contracts/asset_labeling/contract.py:92 + // smart_contracts/asset_labeling/contract.py:103 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/asset_labeling/contract.py:92 + // smart_contracts/asset_labeling/contract.py:103 // @abimethod(readonly=True) callsub log_labels intc_0 // 1 return main_get_label_route@8: - // smart_contracts/asset_labeling/contract.py:87 + // smart_contracts/asset_labeling/contract.py:98 // @abimethod(readonly=True) txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 - // smart_contracts/asset_labeling/contract.py:87 + // smart_contracts/asset_labeling/contract.py:98 // @abimethod(readonly=True) callsub get_label bytec_0 // 0x151f7c75 @@ -414,67 +453,88 @@ main_get_label_route@8: return main_remove_label_route@7: - // smart_contracts/asset_labeling/contract.py:79 + // smart_contracts/asset_labeling/contract.py:91 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 - // smart_contracts/asset_labeling/contract.py:79 + // smart_contracts/asset_labeling/contract.py:91 // @abimethod() callsub remove_label intc_0 // 1 return main_add_label_route@6: - // smart_contracts/asset_labeling/contract.py:68 + // smart_contracts/asset_labeling/contract.py:80 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // smart_contracts/asset_labeling/contract.py:68 + // smart_contracts/asset_labeling/contract.py:80 // @abimethod() callsub add_label intc_0 // 1 return main_change_admin_route@5: - // smart_contracts/asset_labeling/contract.py:63 + // smart_contracts/asset_labeling/contract.py:75 // @abimethod() txn OnCompletion ! assert // OnCompletion is not NoOp txn ApplicationID assert // can only call when not creating - // smart_contracts/asset_labeling/contract.py:51 + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txna ApplicationArgs 1 btoi txnas Accounts - // smart_contracts/asset_labeling/contract.py:63 + // smart_contracts/asset_labeling/contract.py:75 // @abimethod() callsub change_admin intc_0 // 1 return -main_bare_routing@27: - // smart_contracts/asset_labeling/contract.py:51 +main_bare_routing@29: + // smart_contracts/asset_labeling/contract.py:55 // class AssetLabeling(ARC4Contract): txn OnCompletion - bnz main_after_if_else@29 + switch main___algopy_default_create@32 main_after_if_else@33 main_after_if_else@33 main_after_if_else@33 main_update@30 main_delete@31 + b main_after_if_else@33 + +main_delete@31: + // smart_contracts/asset_labeling/contract.py:67 + // @arc4.baremethod(allow_actions=("DeleteApplication",)) + txn ApplicationID + assert // can only call when not creating + callsub delete + intc_0 // 1 + return + +main_update@30: + // smart_contracts/asset_labeling/contract.py:63 + // @arc4.baremethod(allow_actions=("UpdateApplication",)) + txn ApplicationID + assert // can only call when not creating + callsub update + intc_0 // 1 + return + +main___algopy_default_create@32: txn ApplicationID ! assert // can only call when creating @@ -653,11 +713,11 @@ dynamic_array_concat_dynamic_element_after_for@8: // smart_contracts.asset_labeling.contract.b2str(b: bytes) -> bytes: b2str: - // smart_contracts/asset_labeling/contract.py:46-47 + // smart_contracts/asset_labeling/contract.py:50-51 // @subroutine // def b2str(b: Bytes) -> arc4.String: proto 1 1 - // smart_contracts/asset_labeling/contract.py:48 + // smart_contracts/asset_labeling/contract.py:52 // return arc4.String(String.from_bytes(b)) frame_dig -1 len @@ -668,9 +728,25 @@ b2str: retsub +// smart_contracts.asset_labeling.contract.AssetLabeling.update() -> void: +update: + // smart_contracts/asset_labeling/contract.py:65 + // self.admin_only() + callsub admin_only + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.delete() -> void: +delete: + // smart_contracts/asset_labeling/contract.py:69 + // self.admin_only() + callsub admin_only + retsub + + // smart_contracts.asset_labeling.contract.AssetLabeling.admin_only() -> void: admin_only: - // smart_contracts/asset_labeling/contract.py:61 + // smart_contracts/asset_labeling/contract.py:73 // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) txn Sender intc_1 // 0 @@ -678,16 +754,16 @@ admin_only: app_global_get_ex assert // check self.admin exists == - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz admin_only_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:61 + // smart_contracts/asset_labeling/contract.py:73 // ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) bytec 7 // "ERR:UNAUTH" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err @@ -697,14 +773,14 @@ admin_only_after_if_else@3: // smart_contracts.asset_labeling.contract.AssetLabeling.change_admin(new_admin: bytes) -> void: change_admin: - // smart_contracts/asset_labeling/contract.py:63-64 + // smart_contracts/asset_labeling/contract.py:75-76 // @abimethod() // def change_admin(self, new_admin: Account) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:65 + // smart_contracts/asset_labeling/contract.py:77 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:66 + // smart_contracts/asset_labeling/contract.py:78 // self.admin = new_admin bytec 4 // "admin" frame_dig -1 @@ -714,53 +790,53 @@ change_admin: // smart_contracts.asset_labeling.contract.AssetLabeling.add_label(id: bytes, name: bytes) -> void: add_label: - // smart_contracts/asset_labeling/contract.py:68-69 + // smart_contracts/asset_labeling/contract.py:80-81 // @abimethod() // def add_label(self, id: String, name: String) -> None: proto 2 0 - // smart_contracts/asset_labeling/contract.py:70 + // smart_contracts/asset_labeling/contract.py:82 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:71 + // smart_contracts/asset_labeling/contract.py:83 // ensure(id not in self.labels, S("ERR:EXISTS")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bz add_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:71 + // smart_contracts/asset_labeling/contract.py:83 // ensure(id not in self.labels, S("ERR:EXISTS")) bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err add_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:72 + // smart_contracts/asset_labeling/contract.py:84 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) frame_dig -2 len intc_2 // 2 == - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz add_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:72 + // smart_contracts/asset_labeling/contract.py:84 // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - bytec 8 // "ERR:LENGTH" - // smart_contracts/asset_labeling/contract.py:37 + pushbytes "ERR:LENGTH" + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err add_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:74 + // smart_contracts/asset_labeling/contract.py:86 // arc4.String(name), frame_dig -1 len @@ -768,7 +844,7 @@ add_label_after_if_else@7: extract 6 2 frame_dig -1 concat - // smart_contracts/asset_labeling/contract.py:73-77 + // smart_contracts/asset_labeling/contract.py:85-89 // self.labels[id] = LabelDescriptor( // arc4.String(name), // arc4.UInt64(0), @@ -788,75 +864,55 @@ add_label_after_if_else@7: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_label(id: bytes) -> void: remove_label: - // smart_contracts/asset_labeling/contract.py:79-80 + // smart_contracts/asset_labeling/contract.py:91-92 // @abimethod() // def remove_label(self, id: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:81 + // smart_contracts/asset_labeling/contract.py:93 // self.admin_only() callsub admin_only - // smart_contracts/asset_labeling/contract.py:82 + // smart_contracts/asset_labeling/contract.py:94 // ensure(id in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz remove_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:82 + // smart_contracts/asset_labeling/contract.py:94 // ensure(id in self.labels, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err remove_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:83 - // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - frame_dig -1 - len - intc_2 // 2 - == - // smart_contracts/asset_labeling/contract.py:36 - // if not cond: - bnz remove_label_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:83 - // ensure(id.bytes.length == 2, S("ERR:LENGTH")) - bytec 8 // "ERR:LENGTH" - // smart_contracts/asset_labeling/contract.py:37 - // log(msg) - log - // smart_contracts/asset_labeling/contract.py:38 - // op.err() - err - -remove_label_after_if_else@7: - // smart_contracts/asset_labeling/contract.py:84 + // smart_contracts/asset_labeling/contract.py:95 // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) frame_dig -1 box_get assert // check self.labels entry exists extract 2 8 // on error: Index access is out of bounds - bytec 9 // 0x0000000000000000 + bytec 8 // 0x0000000000000000 b== - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: - bnz remove_label_after_if_else@11 - // smart_contracts/asset_labeling/contract.py:84 + bnz remove_label_after_if_else@7 + // smart_contracts/asset_labeling/contract.py:95 // ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) - bytec 10 // "ERR:NOEMPTY" - // smart_contracts/asset_labeling/contract.py:37 + bytec 9 // "ERR:NOEMPTY" + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err -remove_label_after_if_else@11: - // smart_contracts/asset_labeling/contract.py:85 +remove_label_after_if_else@7: + // smart_contracts/asset_labeling/contract.py:96 // del self.labels[id] frame_dig -1 box_del @@ -866,30 +922,30 @@ remove_label_after_if_else@11: // smart_contracts.asset_labeling.contract.AssetLabeling.get_label(id: bytes) -> bytes: get_label: - // smart_contracts/asset_labeling/contract.py:87-88 + // smart_contracts/asset_labeling/contract.py:98-99 // @abimethod(readonly=True) // def get_label(self, id: String) -> LabelDescriptor: proto 1 1 - // smart_contracts/asset_labeling/contract.py:89 + // smart_contracts/asset_labeling/contract.py:100 // ensure(id in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz get_label_after_if_else@3 - // smart_contracts/asset_labeling/contract.py:89 + // smart_contracts/asset_labeling/contract.py:100 // ensure(id in self.labels, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err get_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:90 + // smart_contracts/asset_labeling/contract.py:101 // return self.labels[id] frame_dig -1 box_get @@ -899,11 +955,11 @@ get_label_after_if_else@3: // smart_contracts.asset_labeling.contract.AssetLabeling.log_labels(ids: bytes) -> void: log_labels: - // smart_contracts/asset_labeling/contract.py:92-93 + // smart_contracts/asset_labeling/contract.py:103-104 // @abimethod(readonly=True) // def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:94 + // smart_contracts/asset_labeling/contract.py:105 // for _idx, label_id in uenumerate(ids): frame_dig -1 intc_1 // 0 @@ -911,7 +967,7 @@ log_labels: intc_1 // 0 log_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:94 + // smart_contracts/asset_labeling/contract.py:105 // for _idx, label_id in uenumerate(ids): frame_dig 1 frame_dig 0 @@ -932,7 +988,7 @@ log_labels_for_header@1: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:95 + // smart_contracts/asset_labeling/contract.py:106 // log(self.labels[label_id.native]) extract 2 0 box_get @@ -949,11 +1005,11 @@ log_labels_after_for@4: // smart_contracts.asset_labeling.contract.AssetLabeling.admin_or_operator_only(label: bytes) -> void: admin_or_operator_only: - // smart_contracts/asset_labeling/contract.py:99-100 + // smart_contracts/asset_labeling/contract.py:112-113 // @subroutine // def admin_or_operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:101 + // smart_contracts/asset_labeling/contract.py:114 // if Txn.sender == self.admin: txn Sender intc_1 // 0 @@ -962,12 +1018,12 @@ admin_or_operator_only: assert // check self.admin exists == bz admin_or_operator_only_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:102 + // smart_contracts/asset_labeling/contract.py:115 // return retsub admin_or_operator_only_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:103 + // smart_contracts/asset_labeling/contract.py:116 // self.operator_only(label) frame_dig -1 callsub operator_only @@ -976,52 +1032,46 @@ admin_or_operator_only_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.operator_only(label: bytes) -> void: operator_only: - // smart_contracts/asset_labeling/contract.py:105-106 + // smart_contracts/asset_labeling/contract.py:118-119 // @subroutine // def operator_only(self, label: String) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:108 - // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) + // smart_contracts/asset_labeling/contract.py:120 + // operator_index = self.get_operator_label_index(Txn.sender, label) txn Sender frame_dig -1 callsub get_operator_label_index + dup + // smart_contracts/asset_labeling/contract.py:122 + // operator_index != UInt64(NOT_FOUND_KEY) intc 5 // 4294967296 != - // smart_contracts/asset_labeling/contract.py:108-110 - // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) - // and self.get_operator_label_index(Txn.sender, label) - // != UInt64(NOT_FOUND_VALUE), + // smart_contracts/asset_labeling/contract.py:122-123 + // operator_index != UInt64(NOT_FOUND_KEY) + // and operator_index != UInt64(NOT_FOUND_VALUE), bz operator_only_bool_false@3 - // smart_contracts/asset_labeling/contract.py:109 - // and self.get_operator_label_index(Txn.sender, label) - txn Sender - frame_dig -1 - callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:110 - // != UInt64(NOT_FOUND_VALUE), + // smart_contracts/asset_labeling/contract.py:123 + // and operator_index != UInt64(NOT_FOUND_VALUE), + frame_dig 0 intc 4 // 4294967295 - // smart_contracts/asset_labeling/contract.py:109-110 - // and self.get_operator_label_index(Txn.sender, label) - // != UInt64(NOT_FOUND_VALUE), != - // smart_contracts/asset_labeling/contract.py:108-110 - // self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) - // and self.get_operator_label_index(Txn.sender, label) - // != UInt64(NOT_FOUND_VALUE), + // smart_contracts/asset_labeling/contract.py:122-123 + // operator_index != UInt64(NOT_FOUND_KEY) + // and operator_index != UInt64(NOT_FOUND_VALUE), bz operator_only_bool_false@3 intc_0 // 1 operator_only_bool_merge@4: - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz operator_only_after_if_else@7 - // smart_contracts/asset_labeling/contract.py:111 + // smart_contracts/asset_labeling/contract.py:124 // S("ERR:UNAUTH"), bytec 7 // "ERR:UNAUTH" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err @@ -1035,27 +1085,27 @@ operator_only_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_label_index(operator: bytes, label: bytes) -> uint64: get_operator_label_index: - // smart_contracts/asset_labeling/contract.py:114-115 + // smart_contracts/asset_labeling/contract.py:127-128 // @subroutine // def get_operator_label_index(self, operator: Account, label: String) -> UInt64: proto 2 1 intc_1 // 0 bytec_3 // "" dup - // smart_contracts/asset_labeling/contract.py:116 + // smart_contracts/asset_labeling/contract.py:129 // if operator not in self.operators: frame_dig -2 box_len bury 1 bnz get_operator_label_index_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:117 + // smart_contracts/asset_labeling/contract.py:130 // return UInt64(NOT_FOUND_KEY) intc 5 // 4294967296 frame_bury 0 retsub get_operator_label_index_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:118 + // smart_contracts/asset_labeling/contract.py:131 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig -2 box_get @@ -1071,7 +1121,7 @@ get_operator_label_index_after_if_else@2: frame_bury 2 get_operator_label_index_for_header@3: - // smart_contracts/asset_labeling/contract.py:118 + // smart_contracts/asset_labeling/contract.py:131 // for idx, stored_label in uenumerate(self.operators[operator]): frame_dig 2 frame_dig 1 @@ -1090,13 +1140,13 @@ get_operator_label_index_for_header@3: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:119 + // smart_contracts/asset_labeling/contract.py:132 // if stored_label == label: extract 2 0 frame_dig -1 == bz get_operator_label_index_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:120 + // smart_contracts/asset_labeling/contract.py:133 // return idx frame_dig 2 frame_bury 0 @@ -1110,7 +1160,7 @@ get_operator_label_index_after_if_else@6: b get_operator_label_index_for_header@3 get_operator_label_index_after_for@8: - // smart_contracts/asset_labeling/contract.py:121 + // smart_contracts/asset_labeling/contract.py:134 // return UInt64(NOT_FOUND_VALUE) intc 4 // 4294967295 frame_bury 0 @@ -1119,73 +1169,73 @@ get_operator_label_index_after_for@8: // smart_contracts.asset_labeling.contract.AssetLabeling.add_operator_to_label(operator: bytes, label: bytes) -> void: add_operator_to_label: - // smart_contracts/asset_labeling/contract.py:123-124 + // smart_contracts/asset_labeling/contract.py:136-137 // @abimethod() // def add_operator_to_label(self, operator: Account, label: String) -> None: proto 2 0 - // smart_contracts/asset_labeling/contract.py:125 + // smart_contracts/asset_labeling/contract.py:138 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:126 + // smart_contracts/asset_labeling/contract.py:139 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz add_operator_to_label_after_if_else@10 - // smart_contracts/asset_labeling/contract.py:126 + // smart_contracts/asset_labeling/contract.py:139 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err add_operator_to_label_after_if_else@10: - // smart_contracts/asset_labeling/contract.py:127-128 + // smart_contracts/asset_labeling/contract.py:140-141 // # check if operator exists already // if operator in self.operators: frame_dig -2 box_len bury 1 bz add_operator_to_label_else_body@2 - // smart_contracts/asset_labeling/contract.py:131 + // smart_contracts/asset_labeling/contract.py:144 // self.get_operator_label_index(operator, label) frame_dig -2 frame_dig -1 callsub get_operator_label_index - // smart_contracts/asset_labeling/contract.py:132 + // smart_contracts/asset_labeling/contract.py:145 // == UInt64(NOT_FOUND_VALUE), intc 4 // 4294967295 - // smart_contracts/asset_labeling/contract.py:131-132 + // smart_contracts/asset_labeling/contract.py:144-145 // self.get_operator_label_index(operator, label) // == UInt64(NOT_FOUND_VALUE), == - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz add_operator_to_label_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:133 + // smart_contracts/asset_labeling/contract.py:146 // S("ERR:EXISTS"), bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err add_operator_to_label_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:136-137 + // smart_contracts/asset_labeling/contract.py:149-150 // # add label to operator // existing = self.operators[operator].copy() frame_dig -2 box_get assert // check self.operators entry exists - // smart_contracts/asset_labeling/contract.py:138 + // smart_contracts/asset_labeling/contract.py:151 // existing.append(arc4.String(label)) frame_dig -1 len @@ -1195,7 +1245,7 @@ add_operator_to_label_after_if_else@6: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:139 + // smart_contracts/asset_labeling/contract.py:152 // self.operators[operator] = existing.copy() frame_dig -2 box_del @@ -1205,26 +1255,26 @@ add_operator_to_label_after_if_else@6: box_put add_operator_to_label_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:144-145 + // smart_contracts/asset_labeling/contract.py:157-158 // # increment label operators // label_descriptor = self.labels[label].copy() frame_dig -1 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:147 + // smart_contracts/asset_labeling/contract.py:160 // label_descriptor.num_operators.native + UInt64(1) dup pushint 10 // 10 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:146-148 + // smart_contracts/asset_labeling/contract.py:159-161 // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native + UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:149 + // smart_contracts/asset_labeling/contract.py:162 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -1235,7 +1285,7 @@ add_operator_to_label_after_if_else@3: retsub add_operator_to_label_else_body@2: - // smart_contracts/asset_labeling/contract.py:141-142 + // smart_contracts/asset_labeling/contract.py:154-155 // # new operator, create new box // self.operators[operator] = arc4.DynamicArray(arc4.String(label)) frame_dig -1 @@ -1247,7 +1297,7 @@ add_operator_to_label_else_body@2: bytec 6 // 0x0002 swap concat - bytec 11 // 0x0001 + bytec 10 // 0x0001 swap concat frame_dig -2 @@ -1261,7 +1311,7 @@ add_operator_to_label_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_operator_from_label(operator: bytes, label: bytes) -> void: remove_operator_from_label: - // smart_contracts/asset_labeling/contract.py:151-152 + // smart_contracts/asset_labeling/contract.py:164-165 // @abimethod() // def remove_operator_from_label(self, operator: Account, label: String) -> None: proto 2 0 @@ -1269,49 +1319,49 @@ remove_operator_from_label: dupn 4 bytec_3 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:153 + // smart_contracts/asset_labeling/contract.py:166 // self.admin_or_operator_only(label) frame_dig -1 callsub admin_or_operator_only - // smart_contracts/asset_labeling/contract.py:155 + // smart_contracts/asset_labeling/contract.py:168 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -1 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz remove_operator_from_label_after_if_else@28 - // smart_contracts/asset_labeling/contract.py:155 + // smart_contracts/asset_labeling/contract.py:168 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err remove_operator_from_label_after_if_else@28: - // smart_contracts/asset_labeling/contract.py:156 + // smart_contracts/asset_labeling/contract.py:169 // ensure(operator in self.operators, S("ERR:NOEXIST")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz remove_operator_from_label_after_if_else@32 - // smart_contracts/asset_labeling/contract.py:156 + // smart_contracts/asset_labeling/contract.py:169 // ensure(operator in self.operators, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err remove_operator_from_label_after_if_else@32: - // smart_contracts/asset_labeling/contract.py:158-159 + // smart_contracts/asset_labeling/contract.py:171-172 // # ensure label exists in operator // label_idx = self.get_operator_label_index(operator, label) frame_dig -2 @@ -1319,27 +1369,27 @@ remove_operator_from_label_after_if_else@32: callsub get_operator_label_index dup frame_bury 7 - // smart_contracts/asset_labeling/contract.py:161 + // smart_contracts/asset_labeling/contract.py:174 // label_idx != UInt64(NOT_FOUND_VALUE) intc 4 // 4294967295 != - // smart_contracts/asset_labeling/contract.py:161-163 + // smart_contracts/asset_labeling/contract.py:174-176 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above bz remove_operator_from_label_bool_false@3 - // smart_contracts/asset_labeling/contract.py:162-163 + // smart_contracts/asset_labeling/contract.py:175-176 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above frame_dig 7 - // smart_contracts/asset_labeling/contract.py:163 + // smart_contracts/asset_labeling/contract.py:176 // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above intc 5 // 4294967296 - // smart_contracts/asset_labeling/contract.py:162-163 + // smart_contracts/asset_labeling/contract.py:175-176 // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above != - // smart_contracts/asset_labeling/contract.py:161-163 + // smart_contracts/asset_labeling/contract.py:174-176 // label_idx != UInt64(NOT_FOUND_VALUE) // and label_idx // != UInt64(NOT_FOUND_KEY), # key check redundant, checked above @@ -1347,21 +1397,21 @@ remove_operator_from_label_after_if_else@32: intc_0 // 1 remove_operator_from_label_bool_merge@4: - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz remove_operator_from_label_after_if_else@24 - // smart_contracts/asset_labeling/contract.py:164 + // smart_contracts/asset_labeling/contract.py:177 // S("ERR:NOEXIST"), bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err remove_operator_from_label_after_if_else@24: - // smart_contracts/asset_labeling/contract.py:167-168 + // smart_contracts/asset_labeling/contract.py:180-181 // # ensure only empty labels can be left operator-less // label_descriptor = self.labels[label].copy() frame_dig -1 @@ -1371,7 +1421,7 @@ remove_operator_from_label_after_if_else@24: cover 2 frame_bury 0 assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:170 + // smart_contracts/asset_labeling/contract.py:183 // label_descriptor.num_operators > 1 or label_descriptor.num_assets == 0, extract 10 8 // on error: Index access is out of bounds pushbytes 0x0000000000000001 @@ -1379,7 +1429,7 @@ remove_operator_from_label_after_if_else@24: bnz remove_operator_from_label_bool_true@6 frame_dig 0 extract 2 8 // on error: Index access is out of bounds - bytec 9 // 0x0000000000000000 + bytec 8 // 0x0000000000000000 b== bz remove_operator_from_label_bool_false@7 @@ -1387,21 +1437,21 @@ remove_operator_from_label_bool_true@6: intc_0 // 1 remove_operator_from_label_bool_merge@8: - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz remove_operator_from_label_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:171 + // smart_contracts/asset_labeling/contract.py:184 // S("ERR:NOEMPTY"), - bytec 10 // "ERR:NOEMPTY" - // smart_contracts/asset_labeling/contract.py:37 + bytec 9 // "ERR:NOEMPTY" + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err remove_operator_from_label_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:175 + // smart_contracts/asset_labeling/contract.py:188 // label_descriptor.num_operators.native - UInt64(1) frame_dig 0 dup @@ -1409,14 +1459,14 @@ remove_operator_from_label_after_if_else@20: extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:173-176 + // smart_contracts/asset_labeling/contract.py:186-189 // # decr operator count // label_descriptor.num_operators = arc4.UInt64( // label_descriptor.num_operators.native - UInt64(1) // ) itob replace2 10 - // smart_contracts/asset_labeling/contract.py:177 + // smart_contracts/asset_labeling/contract.py:190 // self.labels[label] = label_descriptor.copy() frame_dig -1 box_del @@ -1424,7 +1474,7 @@ remove_operator_from_label_after_if_else@20: frame_dig -1 swap box_put - // smart_contracts/asset_labeling/contract.py:179 + // smart_contracts/asset_labeling/contract.py:192 // if self.operators[operator].length == 1: frame_dig -2 box_get @@ -1434,7 +1484,7 @@ remove_operator_from_label_after_if_else@20: intc_0 // 1 == bz remove_operator_from_label_else_body@10 - // smart_contracts/asset_labeling/contract.py:180 + // smart_contracts/asset_labeling/contract.py:193 // del self.operators[operator] frame_dig -2 box_del @@ -1442,11 +1492,11 @@ remove_operator_from_label_after_if_else@20: retsub remove_operator_from_label_else_body@10: - // smart_contracts/asset_labeling/contract.py:182 + // smart_contracts/asset_labeling/contract.py:195 // next_list = arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 frame_bury 2 - // smart_contracts/asset_labeling/contract.py:183-186 + // smart_contracts/asset_labeling/contract.py:196-199 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1465,7 +1515,7 @@ remove_operator_from_label_else_body@10: frame_bury 6 remove_operator_from_label_for_header@11: - // smart_contracts/asset_labeling/contract.py:183-186 + // smart_contracts/asset_labeling/contract.py:196-199 // # walk, push everything except index // # this implementation walks twice (once in get_operator_label_index) // # could be more efficient @@ -1490,14 +1540,14 @@ remove_operator_from_label_for_header@11: + extract3 frame_bury 4 - // smart_contracts/asset_labeling/contract.py:187 + // smart_contracts/asset_labeling/contract.py:200 // if label_idx != idx: frame_dig 7 != frame_dig 2 frame_bury 3 bz remove_operator_from_label_after_if_else@14 - // smart_contracts/asset_labeling/contract.py:188 + // smart_contracts/asset_labeling/contract.py:201 // next_list.append(stored_label) frame_dig 2 frame_dig 4 @@ -1515,7 +1565,7 @@ remove_operator_from_label_after_if_else@14: b remove_operator_from_label_for_header@11 remove_operator_from_label_after_for@16: - // smart_contracts/asset_labeling/contract.py:190 + // smart_contracts/asset_labeling/contract.py:203 // self.operators[operator] = next_list.copy() frame_dig -2 box_del @@ -1536,17 +1586,17 @@ remove_operator_from_label_bool_false@3: // smart_contracts.asset_labeling.contract.AssetLabeling.get_operator_labels(operator: bytes) -> bytes: get_operator_labels: - // smart_contracts/asset_labeling/contract.py:192-193 + // smart_contracts/asset_labeling/contract.py:205-206 // @abimethod(readonly=True) // def get_operator_labels(self, operator: Account) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:194 + // smart_contracts/asset_labeling/contract.py:207 // if operator in self.operators: frame_dig -1 box_len bury 1 bz get_operator_labels_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:195 + // smart_contracts/asset_labeling/contract.py:208 // return self.operators[operator] frame_dig -1 box_get @@ -1554,10 +1604,10 @@ get_operator_labels: retsub get_operator_labels_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:47 // return arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 - // smart_contracts/asset_labeling/contract.py:196-197 + // smart_contracts/asset_labeling/contract.py:209-210 // # return empty list // return empty_list() retsub @@ -1565,7 +1615,7 @@ get_operator_labels_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.add_label_to_asset(label: bytes, asset: uint64) -> void: add_label_to_asset: - // smart_contracts/asset_labeling/contract.py:208-209 + // smart_contracts/asset_labeling/contract.py:221-222 // @abimethod() // def add_label_to_asset(self, label: String, asset: Asset) -> None: proto 2 0 @@ -1573,30 +1623,30 @@ add_label_to_asset: dup bytec_3 // "" dup - // smart_contracts/asset_labeling/contract.py:210 + // smart_contracts/asset_labeling/contract.py:223 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz add_label_to_asset_after_if_else@19 - // smart_contracts/asset_labeling/contract.py:210 + // smart_contracts/asset_labeling/contract.py:223 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err add_label_to_asset_after_if_else@19: - // smart_contracts/asset_labeling/contract.py:212 + // smart_contracts/asset_labeling/contract.py:225 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:214 + // smart_contracts/asset_labeling/contract.py:227 // if asset in self.assets: frame_dig -1 itob @@ -1605,43 +1655,43 @@ add_label_to_asset_after_if_else@19: box_len bury 1 bz add_label_to_asset_else_body@2 - // smart_contracts/asset_labeling/contract.py:201 + // smart_contracts/asset_labeling/contract.py:214 // if asset not in self.assets: frame_dig 1 box_len bury 1 bnz add_label_to_asset_after_if_else@6 - // smart_contracts/asset_labeling/contract.py:202 + // smart_contracts/asset_labeling/contract.py:215 // return UInt64(NOT_FOUND_KEY) intc 5 // 4294967296 add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12: - // smart_contracts/asset_labeling/contract.py:217 + // smart_contracts/asset_labeling/contract.py:230 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), intc 4 // 4294967295 == - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz add_label_to_asset_after_if_else@15 - // smart_contracts/asset_labeling/contract.py:218 + // smart_contracts/asset_labeling/contract.py:231 // S("ERR:EXISTS"), bytec 5 // "ERR:EXISTS" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err add_label_to_asset_after_if_else@15: - // smart_contracts/asset_labeling/contract.py:221-222 + // smart_contracts/asset_labeling/contract.py:234-235 // # add label to operator // existing = self.assets[asset].copy() frame_dig 1 dup box_get assert // check self.assets entry exists - // smart_contracts/asset_labeling/contract.py:223 + // smart_contracts/asset_labeling/contract.py:236 // existing.append(arc4.String(label)) frame_dig -2 len @@ -1651,7 +1701,7 @@ add_label_to_asset_after_if_else@15: concat intc_0 // 1 callsub dynamic_array_concat_byte_length_head - // smart_contracts/asset_labeling/contract.py:224 + // smart_contracts/asset_labeling/contract.py:237 // self.assets[asset] = existing.copy() dig 1 box_del @@ -1659,26 +1709,26 @@ add_label_to_asset_after_if_else@15: box_put add_label_to_asset_after_if_else@3: - // smart_contracts/asset_labeling/contract.py:229-230 + // smart_contracts/asset_labeling/contract.py:242-243 // # incr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:232 + // smart_contracts/asset_labeling/contract.py:245 // label_descriptor.num_assets.native + UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 + - // smart_contracts/asset_labeling/contract.py:231-233 + // smart_contracts/asset_labeling/contract.py:244-246 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native + UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:234 + // smart_contracts/asset_labeling/contract.py:247 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1689,7 +1739,7 @@ add_label_to_asset_after_if_else@3: retsub add_label_to_asset_after_if_else@6: - // smart_contracts/asset_labeling/contract.py:203 + // smart_contracts/asset_labeling/contract.py:216 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 1 box_get @@ -1705,7 +1755,7 @@ add_label_to_asset_after_if_else@6: frame_bury 3 add_label_to_asset_for_header@7: - // smart_contracts/asset_labeling/contract.py:203 + // smart_contracts/asset_labeling/contract.py:216 // for idx, stored_label in uenumerate(self.assets[asset]): frame_dig 3 frame_dig 2 @@ -1724,14 +1774,14 @@ add_label_to_asset_for_header@7: intc_2 // 2 + extract3 - // smart_contracts/asset_labeling/contract.py:204 + // smart_contracts/asset_labeling/contract.py:217 // if stored_label == label: extract 2 0 frame_dig -2 == bz add_label_to_asset_after_if_else@10 frame_dig 3 - // smart_contracts/asset_labeling/contract.py:217 + // smart_contracts/asset_labeling/contract.py:230 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 @@ -1743,15 +1793,15 @@ add_label_to_asset_after_if_else@10: b add_label_to_asset_for_header@7 add_label_to_asset_after_for@11: - // smart_contracts/asset_labeling/contract.py:206 + // smart_contracts/asset_labeling/contract.py:219 // return UInt64(NOT_FOUND_VALUE) intc 4 // 4294967295 - // smart_contracts/asset_labeling/contract.py:217 + // smart_contracts/asset_labeling/contract.py:230 // self.get_asset_label_index(asset, label) == UInt64(NOT_FOUND_VALUE), b add_label_to_asset_after_inlined_smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_label_index@12 add_label_to_asset_else_body@2: - // smart_contracts/asset_labeling/contract.py:226-227 + // smart_contracts/asset_labeling/contract.py:239-240 // # new operator, create new box // self.assets[asset] = arc4.DynamicArray(arc4.String(label)) frame_dig -2 @@ -1763,7 +1813,7 @@ add_label_to_asset_else_body@2: bytec 6 // 0x0002 swap concat - bytec 11 // 0x0001 + bytec 10 // 0x0001 swap concat frame_dig 1 @@ -1777,7 +1827,7 @@ add_label_to_asset_else_body@2: // smart_contracts.asset_labeling.contract.AssetLabeling.remove_label_from_asset(label: bytes, asset: uint64) -> void: remove_label_from_asset: - // smart_contracts/asset_labeling/contract.py:236-237 + // smart_contracts/asset_labeling/contract.py:249-250 // @abimethod() // def remove_label_from_asset(self, label: String, asset: Asset) -> None: proto 2 0 @@ -1785,34 +1835,34 @@ remove_label_from_asset: dupn 3 bytec_3 // "" dupn 2 - // smart_contracts/asset_labeling/contract.py:238 + // smart_contracts/asset_labeling/contract.py:251 // ensure(label in self.labels, S("ERR:NOEXIST")) frame_dig -2 box_len bury 1 - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: bnz remove_label_from_asset_after_if_else@20 - // smart_contracts/asset_labeling/contract.py:238 + // smart_contracts/asset_labeling/contract.py:251 // ensure(label in self.labels, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err remove_label_from_asset_after_if_else@20: - // smart_contracts/asset_labeling/contract.py:240 + // smart_contracts/asset_labeling/contract.py:253 // self.operator_only(label) frame_dig -2 callsub operator_only - // smart_contracts/asset_labeling/contract.py:242 + // smart_contracts/asset_labeling/contract.py:255 // found = False intc_1 // 0 frame_bury 5 - // smart_contracts/asset_labeling/contract.py:243 + // smart_contracts/asset_labeling/contract.py:256 // if self.assets[asset].length == 1: frame_dig -1 itob @@ -1825,7 +1875,7 @@ remove_label_from_asset_after_if_else@20: intc_0 // 1 == bz remove_label_from_asset_else_body@5 - // smart_contracts/asset_labeling/contract.py:244 + // smart_contracts/asset_labeling/contract.py:257 // if self.assets[asset][0] == label: frame_dig 3 box_get @@ -1848,52 +1898,52 @@ remove_label_from_asset_after_if_else@20: frame_dig -2 == bz remove_label_from_asset_else_body@3 - // smart_contracts/asset_labeling/contract.py:245 + // smart_contracts/asset_labeling/contract.py:258 // del self.assets[asset] frame_dig 3 box_del pop - // smart_contracts/asset_labeling/contract.py:246 + // smart_contracts/asset_labeling/contract.py:259 // found = True intc_0 // 1 frame_bury 5 remove_label_from_asset_after_if_else@13: - // smart_contracts/asset_labeling/contract.py:36 + // smart_contracts/asset_labeling/contract.py:40 // if not cond: frame_dig 5 bnz remove_label_from_asset_after_if_else@16 - // smart_contracts/asset_labeling/contract.py:261 + // smart_contracts/asset_labeling/contract.py:274 // ensure(found, S("ERR:NOEXIST")) bytec_1 // "ERR:NOEXIST" - // smart_contracts/asset_labeling/contract.py:37 + // smart_contracts/asset_labeling/contract.py:41 // log(msg) log - // smart_contracts/asset_labeling/contract.py:38 + // smart_contracts/asset_labeling/contract.py:42 // op.err() err remove_label_from_asset_after_if_else@16: - // smart_contracts/asset_labeling/contract.py:263-264 + // smart_contracts/asset_labeling/contract.py:276-277 // # decr asset count // label_descriptor = self.labels[label].copy() frame_dig -2 box_get assert // check self.labels entry exists - // smart_contracts/asset_labeling/contract.py:266 + // smart_contracts/asset_labeling/contract.py:279 // label_descriptor.num_assets.native - UInt64(1) dup intc_2 // 2 extract_uint64 intc_0 // 1 - - // smart_contracts/asset_labeling/contract.py:265-267 + // smart_contracts/asset_labeling/contract.py:278-280 // label_descriptor.num_assets = arc4.UInt64( // label_descriptor.num_assets.native - UInt64(1) // ) itob replace2 2 - // smart_contracts/asset_labeling/contract.py:268 + // smart_contracts/asset_labeling/contract.py:281 // self.labels[label] = label_descriptor.copy() frame_dig -2 box_del @@ -1904,18 +1954,18 @@ remove_label_from_asset_after_if_else@16: retsub remove_label_from_asset_else_body@3: - // smart_contracts/asset_labeling/contract.py:248 + // smart_contracts/asset_labeling/contract.py:261 // found = False intc_1 // 0 frame_bury 5 b remove_label_from_asset_after_if_else@13 remove_label_from_asset_else_body@5: - // smart_contracts/asset_labeling/contract.py:250 + // smart_contracts/asset_labeling/contract.py:263 // next_list = arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 frame_bury 1 - // smart_contracts/asset_labeling/contract.py:251-253 + // smart_contracts/asset_labeling/contract.py:264-266 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1933,7 +1983,7 @@ remove_label_from_asset_else_body@5: frame_bury 6 remove_label_from_asset_for_header@6: - // smart_contracts/asset_labeling/contract.py:251-253 + // smart_contracts/asset_labeling/contract.py:264-266 // # walk, push everything to new box except label // # save $found to throw if not found // for idx, stored_label in uenumerate(self.assets[asset]): @@ -1956,13 +2006,13 @@ remove_label_from_asset_for_header@6: extract3 dup frame_bury 2 - // smart_contracts/asset_labeling/contract.py:254 + // smart_contracts/asset_labeling/contract.py:267 // if stored_label != label: extract 2 0 frame_dig -2 != bz remove_label_from_asset_else_body@9 - // smart_contracts/asset_labeling/contract.py:255 + // smart_contracts/asset_labeling/contract.py:268 // next_list.append(stored_label) frame_dig 1 frame_dig 2 @@ -1978,14 +2028,14 @@ remove_label_from_asset_after_if_else@10: b remove_label_from_asset_for_header@6 remove_label_from_asset_else_body@9: - // smart_contracts/asset_labeling/contract.py:257 + // smart_contracts/asset_labeling/contract.py:270 // found = True intc_0 // 1 frame_bury 5 b remove_label_from_asset_after_if_else@10 remove_label_from_asset_after_for@12: - // smart_contracts/asset_labeling/contract.py:259 + // smart_contracts/asset_labeling/contract.py:272 // self.assets[asset] = next_list.copy() frame_dig 3 dup @@ -1998,11 +2048,11 @@ remove_label_from_asset_after_for@12: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_labels(asset: uint64) -> bytes: get_asset_labels: - // smart_contracts/asset_labeling/contract.py:270-271 + // smart_contracts/asset_labeling/contract.py:283-284 // @abimethod(readonly=True) // def get_asset_labels(self, asset: Asset) -> LabelList: proto 1 1 - // smart_contracts/asset_labeling/contract.py:272 + // smart_contracts/asset_labeling/contract.py:285 // if asset in self.assets: frame_dig -1 itob @@ -2010,7 +2060,7 @@ get_asset_labels: box_len bury 1 bz get_asset_labels_after_if_else@2 - // smart_contracts/asset_labeling/contract.py:273 + // smart_contracts/asset_labeling/contract.py:286 // return self.assets[asset] frame_dig 0 box_get @@ -2019,10 +2069,10 @@ get_asset_labels: retsub get_asset_labels_after_if_else@2: - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:47 // return arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 - // smart_contracts/asset_labeling/contract.py:274-275 + // smart_contracts/asset_labeling/contract.py:287-288 // # return empty // return empty_list() swap @@ -2031,17 +2081,17 @@ get_asset_labels_after_if_else@2: // smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_labels(assets: bytes) -> bytes: get_assets_labels: - // smart_contracts/asset_labeling/contract.py:277-280 + // smart_contracts/asset_labeling/contract.py:290-293 // @abimethod(readonly=True) // def get_assets_labels( // self, assets: arc4.DynamicArray[arc4.UInt64] // ) -> arc4.DynamicArray[LabelList]: proto 1 1 intc_1 // 0 - // smart_contracts/asset_labeling/contract.py:281 + // smart_contracts/asset_labeling/contract.py:294 // out = arc4.DynamicArray[LabelList]() bytec_2 // 0x0000 - // smart_contracts/asset_labeling/contract.py:282 + // smart_contracts/asset_labeling/contract.py:295 // for _i, asset_id in uenumerate(assets): frame_dig -1 intc_1 // 0 @@ -2049,7 +2099,7 @@ get_assets_labels: intc_1 // 0 get_assets_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:282 + // smart_contracts/asset_labeling/contract.py:295 // for _i, asset_id in uenumerate(assets): frame_dig 3 frame_dig 2 @@ -2060,10 +2110,10 @@ get_assets_labels_for_header@1: frame_dig 3 intc_3 // 8 * - // smart_contracts/asset_labeling/contract.py:283 + // smart_contracts/asset_labeling/contract.py:296 // asset = Asset(asset_id.native) extract_uint64 - // smart_contracts/asset_labeling/contract.py:284 + // smart_contracts/asset_labeling/contract.py:297 // if asset in self.assets: itob dup @@ -2071,7 +2121,7 @@ get_assets_labels_for_header@1: box_len bury 1 bz get_assets_labels_else_body@4 - // smart_contracts/asset_labeling/contract.py:285 + // smart_contracts/asset_labeling/contract.py:298 // out.append(self.assets[asset].copy()) frame_dig 0 box_get @@ -2098,7 +2148,7 @@ get_assets_labels_after_if_else@5: b get_assets_labels_for_header@1 get_assets_labels_else_body@4: - // smart_contracts/asset_labeling/contract.py:287 + // smart_contracts/asset_labeling/contract.py:300 // out.append(empty_list()) frame_dig 1 dup @@ -2113,7 +2163,7 @@ get_assets_labels_else_body@4: b get_assets_labels_after_if_else@5 get_assets_labels_after_for@7: - // smart_contracts/asset_labeling/contract.py:288 + // smart_contracts/asset_labeling/contract.py:301 // return out frame_dig 1 frame_bury 0 @@ -2122,17 +2172,17 @@ get_assets_labels_after_for@7: // smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro(asset_id: uint64) -> bytes: _get_asset_micro: - // smart_contracts/asset_labeling/contract.py:296-297 + // smart_contracts/asset_labeling/contract.py:309-310 // @subroutine // def _get_asset_micro(self, asset_id: UInt64) -> AssetMicro: proto 1 1 - // smart_contracts/asset_labeling/contract.py:300 + // smart_contracts/asset_labeling/contract.py:313 // unit_name=b2str(asset.unit_name), frame_dig -1 asset_params_get AssetUnitName assert // asset exists callsub b2str - // smart_contracts/asset_labeling/contract.py:301 + // smart_contracts/asset_labeling/contract.py:314 // decimals=arc4.UInt8(asset.decimals), frame_dig -1 asset_params_get AssetDecimals @@ -2144,7 +2194,7 @@ _get_asset_micro: <= assert // overflow extract 7 1 - // smart_contracts/asset_labeling/contract.py:299-302 + // smart_contracts/asset_labeling/contract.py:312-315 // return AssetMicro( // unit_name=b2str(asset.unit_name), // decimals=arc4.UInt8(asset.decimals), @@ -2159,11 +2209,11 @@ _get_asset_micro: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro(asset: uint64) -> bytes: get_asset_micro: - // smart_contracts/asset_labeling/contract.py:304-305 + // smart_contracts/asset_labeling/contract.py:317-318 // @abimethod(readonly=True) // def get_asset_micro(self, asset: UInt64) -> AssetMicro: proto 1 1 - // smart_contracts/asset_labeling/contract.py:306 + // smart_contracts/asset_labeling/contract.py:319 // return self._get_asset_micro(asset) frame_dig -1 callsub _get_asset_micro @@ -2172,11 +2222,11 @@ get_asset_micro: // smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro(assets: bytes) -> void: get_assets_micro: - // smart_contracts/asset_labeling/contract.py:308-309 + // smart_contracts/asset_labeling/contract.py:321-322 // @abimethod(readonly=True) // def get_assets_micro(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:310 + // smart_contracts/asset_labeling/contract.py:323 // for _i, asset_id in uenumerate(assets): frame_dig -1 intc_1 // 0 @@ -2184,7 +2234,7 @@ get_assets_micro: intc_1 // 0 get_assets_micro_for_header@1: - // smart_contracts/asset_labeling/contract.py:310 + // smart_contracts/asset_labeling/contract.py:323 // for _i, asset_id in uenumerate(assets): frame_dig 1 frame_dig 0 @@ -2197,7 +2247,7 @@ get_assets_micro_for_header@1: cover 2 intc_3 // 8 * - // smart_contracts/asset_labeling/contract.py:311 + // smart_contracts/asset_labeling/contract.py:324 // log(self._get_asset_micro(asset_id.native)) extract_uint64 callsub _get_asset_micro @@ -2213,17 +2263,17 @@ get_assets_micro_after_for@4: // smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_micro_labels(asset_id: uint64) -> bytes: _get_asset_micro_labels: - // smart_contracts/asset_labeling/contract.py:315-316 + // smart_contracts/asset_labeling/contract.py:328-329 // @subroutine // def _get_asset_micro_labels(self, asset_id: UInt64) -> AssetMicroLabels: proto 1 1 - // smart_contracts/asset_labeling/contract.py:319 + // smart_contracts/asset_labeling/contract.py:332 // unit_name=b2str(asset.unit_name), frame_dig -1 asset_params_get AssetUnitName assert // asset exists callsub b2str - // smart_contracts/asset_labeling/contract.py:320 + // smart_contracts/asset_labeling/contract.py:333 // decimals=arc4.UInt8(asset.decimals), frame_dig -1 asset_params_get AssetDecimals @@ -2235,7 +2285,7 @@ _get_asset_micro_labels: <= assert // overflow extract 7 1 - // smart_contracts/asset_labeling/contract.py:321 + // smart_contracts/asset_labeling/contract.py:334 // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), frame_dig -1 itob @@ -2248,7 +2298,7 @@ _get_asset_micro_labels: assert // check self.assets entry exists _get_asset_micro_labels_ternary_merge@3: - // smart_contracts/asset_labeling/contract.py:318-322 + // smart_contracts/asset_labeling/contract.py:331-335 // return AssetMicroLabels( // unit_name=b2str(asset.unit_name), // decimals=arc4.UInt8(asset.decimals), @@ -2274,7 +2324,7 @@ _get_asset_micro_labels_ternary_merge@3: retsub _get_asset_micro_labels_ternary_false@2: - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:47 // return arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 b _get_asset_micro_labels_ternary_merge@3 @@ -2282,11 +2332,11 @@ _get_asset_micro_labels_ternary_false@2: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_micro_labels(asset: uint64) -> bytes: get_asset_micro_labels: - // smart_contracts/asset_labeling/contract.py:324-325 + // smart_contracts/asset_labeling/contract.py:337-338 // @abimethod(readonly=True) // def get_asset_micro_labels(self, asset: UInt64) -> AssetMicroLabels: proto 1 1 - // smart_contracts/asset_labeling/contract.py:326 + // smart_contracts/asset_labeling/contract.py:339 // return self._get_asset_micro_labels(asset) frame_dig -1 callsub _get_asset_micro_labels @@ -2295,11 +2345,11 @@ get_asset_micro_labels: // smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_micro_labels(assets: bytes) -> void: get_assets_micro_labels: - // smart_contracts/asset_labeling/contract.py:328-329 + // smart_contracts/asset_labeling/contract.py:341-342 // @abimethod(readonly=True) // def get_assets_micro_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:330 + // smart_contracts/asset_labeling/contract.py:343 // for _i, asset_id in uenumerate(assets): frame_dig -1 intc_1 // 0 @@ -2307,7 +2357,7 @@ get_assets_micro_labels: intc_1 // 0 get_assets_micro_labels_for_header@1: - // smart_contracts/asset_labeling/contract.py:330 + // smart_contracts/asset_labeling/contract.py:343 // for _i, asset_id in uenumerate(assets): frame_dig 1 frame_dig 0 @@ -2320,7 +2370,7 @@ get_assets_micro_labels_for_header@1: cover 2 intc_3 // 8 * - // smart_contracts/asset_labeling/contract.py:331 + // smart_contracts/asset_labeling/contract.py:344 // log(self._get_asset_micro_labels(asset_id.native)) extract_uint64 callsub _get_asset_micro_labels @@ -2336,23 +2386,29 @@ get_assets_micro_labels_after_for@4: // smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text(asset_id: uint64) -> bytes: _get_asset_text: - // smart_contracts/asset_labeling/contract.py:335-336 + // smart_contracts/asset_labeling/contract.py:348-349 // @subroutine // def _get_asset_text(self, asset_id: UInt64) -> AssetText: proto 1 1 - // smart_contracts/asset_labeling/contract.py:339 + // smart_contracts/asset_labeling/contract.py:352 // name=b2str(asset.name), frame_dig -1 asset_params_get AssetName assert // asset exists callsub b2str - // smart_contracts/asset_labeling/contract.py:340 + // smart_contracts/asset_labeling/contract.py:353 // unit_name=b2str(asset.unit_name), frame_dig -1 asset_params_get AssetUnitName assert // asset exists callsub b2str - // smart_contracts/asset_labeling/contract.py:342 + // smart_contracts/asset_labeling/contract.py:354 + // url=b2str(asset.url), + frame_dig -1 + asset_params_get AssetURL + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:355 // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), frame_dig -1 itob @@ -2360,18 +2416,12 @@ _get_asset_text: box_len bury 1 bz _get_asset_text_ternary_false@2 - frame_dig 2 + frame_dig 3 box_get assert // check self.assets entry exists _get_asset_text_ternary_merge@3: - // smart_contracts/asset_labeling/contract.py:341 - // url=b2str(asset.url), - frame_dig -1 - asset_params_get AssetURL - assert // asset exists - callsub b2str - // smart_contracts/asset_labeling/contract.py:338-343 + // smart_contracts/asset_labeling/contract.py:351-356 // return AssetText( // name=b2str(asset.name), // unit_name=b2str(asset.unit_name), @@ -2401,7 +2451,7 @@ _get_asset_text_ternary_merge@3: uncover 2 swap concat - uncover 5 + frame_dig 2 dup cover 3 len @@ -2422,7 +2472,7 @@ _get_asset_text_ternary_merge@3: retsub _get_asset_text_ternary_false@2: - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:47 // return arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 b _get_asset_text_ternary_merge@3 @@ -2430,11 +2480,11 @@ _get_asset_text_ternary_false@2: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text(asset: uint64) -> bytes: get_asset_text: - // smart_contracts/asset_labeling/contract.py:345-346 + // smart_contracts/asset_labeling/contract.py:358-359 // @abimethod(readonly=True) // def get_asset_text(self, asset: UInt64) -> AssetText: proto 1 1 - // smart_contracts/asset_labeling/contract.py:347 + // smart_contracts/asset_labeling/contract.py:360 // return self._get_asset_text(asset) frame_dig -1 callsub _get_asset_text @@ -2443,11 +2493,11 @@ get_asset_text: // smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text(assets: bytes) -> void: get_assets_text: - // smart_contracts/asset_labeling/contract.py:349-350 + // smart_contracts/asset_labeling/contract.py:362-363 // @abimethod(readonly=True) // def get_assets_text(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:351 + // smart_contracts/asset_labeling/contract.py:364 // for _i, asset_id in uenumerate(assets): frame_dig -1 intc_1 // 0 @@ -2455,7 +2505,7 @@ get_assets_text: intc_1 // 0 get_assets_text_for_header@1: - // smart_contracts/asset_labeling/contract.py:351 + // smart_contracts/asset_labeling/contract.py:364 // for _i, asset_id in uenumerate(assets): frame_dig 1 frame_dig 0 @@ -2468,7 +2518,7 @@ get_assets_text_for_header@1: cover 2 intc_3 // 8 * - // smart_contracts/asset_labeling/contract.py:352 + // smart_contracts/asset_labeling/contract.py:365 // log(self._get_asset_text(asset_id.native)) extract_uint64 callsub _get_asset_text @@ -2482,25 +2532,135 @@ get_assets_text_after_for@4: retsub +// smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_text_labels(asset_id: uint64) -> bytes: +_get_asset_text_labels: + // smart_contracts/asset_labeling/contract.py:369-370 + // @subroutine + // def _get_asset_text_labels(self, asset_id: UInt64) -> AssetTextLabels: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:373 + // name=b2str(asset.name), + frame_dig -1 + asset_params_get AssetName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:374 + // unit_name=b2str(asset.unit_name), + frame_dig -1 + asset_params_get AssetUnitName + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:375 + // url=b2str(asset.url), + frame_dig -1 + asset_params_get AssetURL + assert // asset exists + callsub b2str + // smart_contracts/asset_labeling/contract.py:372-376 + // return AssetTextLabels( + // name=b2str(asset.name), + // unit_name=b2str(asset.unit_name), + // url=b2str(asset.url), + // ) + dig 2 + len + pushint 6 // 6 + + + dup + itob + extract 6 2 + pushbytes 0x0006 + swap + concat + dig 3 + len + uncover 2 + + + itob + extract 6 2 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_text_labels(asset: uint64) -> bytes: +get_asset_text_labels: + // smart_contracts/asset_labeling/contract.py:378-379 + // @abimethod(readonly=True) + // def get_asset_text_labels(self, asset: UInt64) -> AssetTextLabels: + proto 1 1 + // smart_contracts/asset_labeling/contract.py:380 + // return self._get_asset_text_labels(asset) + frame_dig -1 + callsub _get_asset_text_labels + retsub + + +// smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_text_labels(assets: bytes) -> void: +get_assets_text_labels: + // smart_contracts/asset_labeling/contract.py:382-383 + // @abimethod(readonly=True) + // def get_assets_text_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + proto 1 0 + // smart_contracts/asset_labeling/contract.py:384 + // for _i, asset_id in uenumerate(assets): + frame_dig -1 + intc_1 // 0 + extract_uint16 + intc_1 // 0 + +get_assets_text_labels_for_header@1: + // smart_contracts/asset_labeling/contract.py:384 + // for _i, asset_id in uenumerate(assets): + frame_dig 1 + frame_dig 0 + < + bz get_assets_text_labels_after_for@4 + frame_dig -1 + extract 2 0 + frame_dig 1 + dup + cover 2 + intc_3 // 8 + * + // smart_contracts/asset_labeling/contract.py:385 + // log(self._get_asset_text_labels(asset_id.native)) + extract_uint64 + callsub _get_asset_text_labels + log + intc_0 // 1 + + + frame_bury 1 + b get_assets_text_labels_for_header@1 + +get_assets_text_labels_after_for@4: + retsub + + // smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_small(asset_id: uint64) -> bytes: _get_asset_small: - // smart_contracts/asset_labeling/contract.py:356-357 + // smart_contracts/asset_labeling/contract.py:389-390 // @subroutine // def _get_asset_small(self, asset_id: UInt64) -> AssetSmall: proto 1 1 - // smart_contracts/asset_labeling/contract.py:360 + // smart_contracts/asset_labeling/contract.py:393 // name=b2str(asset.name), frame_dig -1 asset_params_get AssetName assert // asset exists callsub b2str - // smart_contracts/asset_labeling/contract.py:361 + // smart_contracts/asset_labeling/contract.py:394 // unit_name=b2str(asset.unit_name), frame_dig -1 asset_params_get AssetUnitName assert // asset exists callsub b2str - // smart_contracts/asset_labeling/contract.py:362 + // smart_contracts/asset_labeling/contract.py:395 // decimals=arc4.UInt8(asset.decimals), frame_dig -1 asset_params_get AssetDecimals @@ -2512,13 +2672,13 @@ _get_asset_small: <= assert // overflow extract 7 1 - // smart_contracts/asset_labeling/contract.py:363 + // smart_contracts/asset_labeling/contract.py:396 // total=arc4.UInt64(asset.total), frame_dig -1 asset_params_get AssetTotal assert // asset exists itob - // smart_contracts/asset_labeling/contract.py:364 + // smart_contracts/asset_labeling/contract.py:397 // has_freeze=arc4.Bool(asset.freeze != Global.zero_address), frame_dig -1 asset_params_get AssetFreeze @@ -2529,7 +2689,7 @@ _get_asset_small: intc_1 // 0 uncover 2 setbit - // smart_contracts/asset_labeling/contract.py:365 + // smart_contracts/asset_labeling/contract.py:398 // has_clawback=arc4.Bool(asset.clawback != Global.zero_address), frame_dig -1 asset_params_get AssetClawback @@ -2540,7 +2700,7 @@ _get_asset_small: intc_1 // 0 uncover 2 setbit - // smart_contracts/asset_labeling/contract.py:366 + // smart_contracts/asset_labeling/contract.py:399 // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), frame_dig -1 itob @@ -2553,7 +2713,7 @@ _get_asset_small: assert // check self.assets entry exists _get_asset_small_ternary_merge@3: - // smart_contracts/asset_labeling/contract.py:359-367 + // smart_contracts/asset_labeling/contract.py:392-400 // return AssetSmall( // name=b2str(asset.name), // unit_name=b2str(asset.unit_name), @@ -2607,7 +2767,7 @@ _get_asset_small_ternary_merge@3: retsub _get_asset_small_ternary_false@2: - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:47 // return arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 b _get_asset_small_ternary_merge@3 @@ -2615,11 +2775,11 @@ _get_asset_small_ternary_false@2: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_small(asset: uint64) -> bytes: get_asset_small: - // smart_contracts/asset_labeling/contract.py:369-370 + // smart_contracts/asset_labeling/contract.py:402-403 // @abimethod(readonly=True) // def get_asset_small(self, asset: UInt64) -> AssetSmall: proto 1 1 - // smart_contracts/asset_labeling/contract.py:371 + // smart_contracts/asset_labeling/contract.py:404 // return self._get_asset_small(asset) frame_dig -1 callsub _get_asset_small @@ -2628,11 +2788,11 @@ get_asset_small: // smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_small(assets: bytes) -> void: get_assets_small: - // smart_contracts/asset_labeling/contract.py:373-374 + // smart_contracts/asset_labeling/contract.py:406-407 // @abimethod(readonly=True) // def get_assets_small(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:375 + // smart_contracts/asset_labeling/contract.py:408 // for _i, asset_id in uenumerate(assets): frame_dig -1 intc_1 // 0 @@ -2640,7 +2800,7 @@ get_assets_small: intc_1 // 0 get_assets_small_for_header@1: - // smart_contracts/asset_labeling/contract.py:375 + // smart_contracts/asset_labeling/contract.py:408 // for _i, asset_id in uenumerate(assets): frame_dig 1 frame_dig 0 @@ -2653,7 +2813,7 @@ get_assets_small_for_header@1: cover 2 intc_3 // 8 * - // smart_contracts/asset_labeling/contract.py:376 + // smart_contracts/asset_labeling/contract.py:409 // log(self._get_asset_small(asset_id.native)) extract_uint64 callsub _get_asset_small @@ -2669,13 +2829,13 @@ get_assets_small_after_for@4: // smart_contracts.asset_labeling.contract.AssetLabeling._get_asset_full(asset_id: uint64) -> bytes: _get_asset_full: - // smart_contracts/asset_labeling/contract.py:380-381 + // smart_contracts/asset_labeling/contract.py:413-414 // @subroutine // def _get_asset_full(self, asset_id: UInt64) -> AssetFull: proto 1 1 intc_1 // 0 dupn 11 - // smart_contracts/asset_labeling/contract.py:383 + // smart_contracts/asset_labeling/contract.py:416 // reserve_acct = Account(asset.reserve.bytes) frame_dig -1 asset_params_get AssetReserve @@ -2683,17 +2843,17 @@ _get_asset_full: dup uncover 2 assert // asset exists - // smart_contracts/asset_labeling/contract.py:386 + // smart_contracts/asset_labeling/contract.py:419 // if reserve_acct.is_opted_in(asset) frame_dig -1 asset_holding_get AssetBalance bury 1 - // smart_contracts/asset_labeling/contract.py:385-387 + // smart_contracts/asset_labeling/contract.py:418-420 // asset.balance(reserve_acct) // if reserve_acct.is_opted_in(asset) // else UInt64(0) bz _get_asset_full_ternary_false@2 - // smart_contracts/asset_labeling/contract.py:385 + // smart_contracts/asset_labeling/contract.py:418 // asset.balance(reserve_acct) frame_dig 12 frame_dig -1 @@ -2701,35 +2861,35 @@ _get_asset_full: assert // account opted into asset _get_asset_full_ternary_merge@3: - // smart_contracts/asset_labeling/contract.py:390 + // smart_contracts/asset_labeling/contract.py:423 // name=b2str(asset.name), frame_dig -1 asset_params_get AssetName assert // asset exists callsub b2str frame_bury 1 - // smart_contracts/asset_labeling/contract.py:391 + // smart_contracts/asset_labeling/contract.py:424 // unit_name=b2str(asset.unit_name), frame_dig -1 asset_params_get AssetUnitName assert // asset exists callsub b2str frame_bury 2 - // smart_contracts/asset_labeling/contract.py:392 + // smart_contracts/asset_labeling/contract.py:425 // url=b2str(asset.url), frame_dig -1 asset_params_get AssetURL assert // asset exists callsub b2str frame_bury 3 - // smart_contracts/asset_labeling/contract.py:393 + // smart_contracts/asset_labeling/contract.py:426 // total=arc4.UInt64(asset.total), frame_dig -1 asset_params_get AssetTotal assert // asset exists itob frame_bury 6 - // smart_contracts/asset_labeling/contract.py:394 + // smart_contracts/asset_labeling/contract.py:427 // decimals=arc4.UInt8(asset.decimals), frame_dig -1 asset_params_get AssetDecimals @@ -2742,35 +2902,35 @@ _get_asset_full_ternary_merge@3: assert // overflow extract 7 1 frame_bury 5 - // smart_contracts/asset_labeling/contract.py:395 + // smart_contracts/asset_labeling/contract.py:428 // manager=arc4.Address(asset.manager), frame_dig -1 asset_params_get AssetManager swap frame_bury 9 assert // asset exists - // smart_contracts/asset_labeling/contract.py:396 + // smart_contracts/asset_labeling/contract.py:429 // freeze=arc4.Address(asset.freeze), frame_dig -1 asset_params_get AssetFreeze swap frame_bury 10 assert // asset exists - // smart_contracts/asset_labeling/contract.py:397 + // smart_contracts/asset_labeling/contract.py:430 // clawback=arc4.Address(asset.clawback), frame_dig -1 asset_params_get AssetClawback swap frame_bury 11 assert // asset exists - // smart_contracts/asset_labeling/contract.py:398 + // smart_contracts/asset_labeling/contract.py:431 // reserve=arc4.Address(asset.reserve), frame_dig -1 asset_params_get AssetReserve swap frame_bury 8 assert // asset exists - // smart_contracts/asset_labeling/contract.py:400 + // smart_contracts/asset_labeling/contract.py:433 // metadata_hash=arc4.DynamicBytes(asset.metadata_hash), frame_dig -1 asset_params_get AssetMetadataHash @@ -2782,11 +2942,11 @@ _get_asset_full_ternary_merge@3: swap concat frame_bury 0 - // smart_contracts/asset_labeling/contract.py:399 + // smart_contracts/asset_labeling/contract.py:432 // reserve_balance=arc4.UInt64(reserve_balance), itob frame_bury 7 - // smart_contracts/asset_labeling/contract.py:401 + // smart_contracts/asset_labeling/contract.py:434 // labels=self.assets[asset].copy() if asset in self.assets else empty_list(), frame_dig -1 itob @@ -2800,7 +2960,7 @@ _get_asset_full_ternary_merge@3: assert // check self.assets entry exists _get_asset_full_ternary_merge@6: - // smart_contracts/asset_labeling/contract.py:389-402 + // smart_contracts/asset_labeling/contract.py:422-435 // return AssetFull( // name=b2str(asset.name), // unit_name=b2str(asset.unit_name), @@ -2888,13 +3048,13 @@ _get_asset_full_ternary_merge@6: retsub _get_asset_full_ternary_false@5: - // smart_contracts/asset_labeling/contract.py:43 + // smart_contracts/asset_labeling/contract.py:47 // return arc4.DynamicArray[arc4.String]() bytec_2 // 0x0000 b _get_asset_full_ternary_merge@6 _get_asset_full_ternary_false@2: - // smart_contracts/asset_labeling/contract.py:387 + // smart_contracts/asset_labeling/contract.py:420 // else UInt64(0) intc_1 // 0 b _get_asset_full_ternary_merge@3 @@ -2902,11 +3062,11 @@ _get_asset_full_ternary_false@2: // smart_contracts.asset_labeling.contract.AssetLabeling.get_asset_full(asset: uint64) -> bytes: get_asset_full: - // smart_contracts/asset_labeling/contract.py:404-405 + // smart_contracts/asset_labeling/contract.py:437-438 // @abimethod(readonly=True) // def get_asset_full(self, asset: UInt64) -> AssetFull: proto 1 1 - // smart_contracts/asset_labeling/contract.py:406 + // smart_contracts/asset_labeling/contract.py:439 // return self._get_asset_full(asset) frame_dig -1 callsub _get_asset_full @@ -2915,11 +3075,11 @@ get_asset_full: // smart_contracts.asset_labeling.contract.AssetLabeling.get_assets_full(assets: bytes) -> void: get_assets_full: - // smart_contracts/asset_labeling/contract.py:408-409 + // smart_contracts/asset_labeling/contract.py:441-442 // @abimethod(readonly=True) // def get_assets_full(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: proto 1 0 - // smart_contracts/asset_labeling/contract.py:410 + // smart_contracts/asset_labeling/contract.py:443 // for _i, asset_id in uenumerate(assets): frame_dig -1 intc_1 // 0 @@ -2927,7 +3087,7 @@ get_assets_full: intc_1 // 0 get_assets_full_for_header@1: - // smart_contracts/asset_labeling/contract.py:410 + // smart_contracts/asset_labeling/contract.py:443 // for _i, asset_id in uenumerate(assets): frame_dig 1 frame_dig 0 @@ -2940,7 +3100,7 @@ get_assets_full_for_header@1: cover 2 intc_3 // 8 * - // smart_contracts/asset_labeling/contract.py:411 + // smart_contracts/asset_labeling/contract.py:444 // log(self._get_asset_full(asset_id.native)) extract_uint64 callsub _get_asset_full diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json index 265808e..a0b15fc 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabeling.arc56.json @@ -114,9 +114,23 @@ "name": "unit_name", "type": "string" }, + { + "name": "url", + "type": "string" + }, { "name": "labels", "type": "string[]" + } + ], + "AssetTextLabels": [ + { + "name": "name", + "type": "string" + }, + { + "name": "unit_name", + "type": "string" }, { "name": "url", @@ -507,7 +521,7 @@ } ], "returns": { - "type": "(string,string,string[],string)", + "type": "(string,string,string,string[])", "struct": "AssetText" }, "actions": { @@ -541,6 +555,49 @@ "events": [], "recommendations": {} }, + { + "name": "get_asset_text_labels", + "args": [ + { + "type": "uint64", + "name": "asset" + } + ], + "returns": { + "type": "(string,string,string)", + "struct": "AssetTextLabels" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_assets_text_labels", + "args": [ + { + "type": "uint64[]", + "name": "assets" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, { "name": "get_asset_small", "args": [ @@ -681,166 +738,178 @@ "create": [ "NoOp" ], - "call": [] + "call": [ + "DeleteApplication", + "UpdateApplication" + ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ - 1107, - 1546, - 1565, - 1990 + 1181, + 1616, + 1635, + 2060 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ - 287, - 302, - 322, - 337, - 357, - 372, - 392, - 407, - 427, - 442, - 462, - 481, - 503, - 527, - 551, - 573, - 597, - 621, - 636, - 658, - 676, - 700 + 290, + 305, + 325, + 340, + 360, + 375, + 395, + 410, + 430, + 445, + 465, + 480, + 500, + 519, + 541, + 565, + 589, + 611, + 635, + 659, + 674, + 696, + 714, + 738 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ - 2856 + 3040 ], "errorMessage": "account opted into asset" }, { "pc": [ - 2274, - 2282, - 2358, - 2366, - 2478, - 2486, - 2508, - 2635, - 2643, - 2651, - 2665, - 2671, - 2686, - 2840, - 2861, - 2871, - 2881, - 2891, - 2899, - 2918, - 2926, - 2934, - 2942, - 2947 + 2344, + 2352, + 2428, + 2436, + 2548, + 2556, + 2564, + 2705, + 2713, + 2721, + 2819, + 2827, + 2835, + 2849, + 2855, + 2870, + 3024, + 3045, + 3055, + 3065, + 3075, + 3083, + 3102, + 3110, + 3118, + 3126, + 3131 ], "errorMessage": "asset exists" }, { "pc": [ - 723 + 791 ], "errorMessage": "can only call when creating" }, { "pc": [ - 290, - 305, - 325, - 340, - 360, - 375, - 395, - 410, - 430, - 445, - 465, - 484, - 506, - 530, - 554, - 576, - 600, - 624, - 639, - 661, - 679, - 703 + 293, + 308, + 328, + 343, + 363, + 378, + 398, + 413, + 433, + 448, + 468, + 483, + 503, + 522, + 544, + 568, + 592, + 614, + 638, + 662, + 677, + 699, + 717, + 741, + 774, + 782 ], "errorMessage": "can only call when not creating" }, { "pc": [ - 981, - 1204 + 1057, + 1278 ], "errorMessage": "check self.admin exists" }, { "pc": [ - 1796, - 1846, - 1971, - 1982, - 2062, - 2160, - 2207, - 2389, - 2503, - 2710, - 2976 + 1866, + 1916, + 2041, + 2052, + 2132, + 2230, + 2277, + 2459, + 2581, + 2894, + 3160 ], "errorMessage": "check self.assets entry exists" }, { "pc": [ - 1106, - 1142, - 1185, - 1421, - 1545, - 1819, - 2026 + 1180, + 1216, + 1259, + 1491, + 1615, + 1889, + 2096 ], "errorMessage": "check self.labels entry exists" }, { "pc": [ - 1286, - 1395, - 1604, - 1629, - 1733 + 1356, + 1465, + 1674, + 1699, + 1803 ], "errorMessage": "check self.operators entry exists" }, { "pc": [ - 2288, - 2372, - 2657, - 2905 + 2358, + 2442, + 2841, + 3089 ], "errorMessage": "overflow" } @@ -853,11 +922,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW4gPSBUeG4uc2VuZGVyCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI5CiAgICBwdXNoYnl0ZXNzIDB4OGYwZDdkOGUgMHg3YzFiMzJmNiAweDE3ZTY5MWFlIDB4MzNkMGZmZGMgMHg3MjU2MTZlNyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAweGE2N2YwM2MyIDB4YWFlZTBjNjEgMHhiNmMzOWY2OCAweDYzNWJlMzYyIDB4NzA5M2IxMGQgMHhlMWJiOTVmYyAweDU1NDBiODBhIDB4OGE0MTJmOTMgMHg2ZjE3Y2RkNSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfdGV4dF9sYWJlbHModWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dF9sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3NtYWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyx1aW50OCx1aW50NjQsYm9vbCxib29sLHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19zbWFsbCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfZnVsbCh1aW50NjQpKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ2NCx1aW50OCxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGJ5dGVbXSx1aW50NjQsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX2Z1bGwodWludDY0W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUgbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNyBtYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTggbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjAgbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMSBtYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMiBtYWluX2dldF9hc3NldF90ZXh0X2xhYmVsc19yb3V0ZUAyMyBtYWluX2dldF9hc3NldHNfdGV4dF9sYWJlbHNfcm91dGVAMjQgbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjUgbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjcgbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjgKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDQxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2Z1bGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfZnVsbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19zbWFsbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfc21hbGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dF9sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3RleHRfbGFiZWxzX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3RleHRfbGFiZWxzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMyBtYWluX2FmdGVyX2lmX2Vsc2VAMzMgbWFpbl91cGRhdGVAMzAgbWFpbl9kZWxldGVAMzEKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzCgptYWluX2RlbGV0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdXBkYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMyOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTIKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnVwZGF0ZSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZGVsZXRlKCkgLT4gdm9pZDoKZGVsZXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUtNzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAtODEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIHB1c2hieXRlcyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NS04OQogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDkgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTYKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTk5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMy0xMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA1CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE0CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gb3BlcmF0b3JfaW5kZXggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjItMTIzCiAgICAvLyBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCm9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDAtMTQxCiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTIKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU5LTE2MQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3NgogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzYKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc3CiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAtMTgxCiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOSAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2LTE5OQogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Ni0xOTkKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5LTIxMAogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTQKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQtMjM1CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0Mi0yNDMKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ0LTI0NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzktMjQwCiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTkKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2LTI3NwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgtMjgwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjEKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcwCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMtMjg0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODctMjg4CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MC0yOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk3CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk4CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAxCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF9taWNybyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE0CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEyLTMxNQogICAgLy8gcmV0dXJuIEFzc2V0TWljcm8oCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE3LTMxOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNybyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm8oYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNybyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMyCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMzCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM0CiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzEtMzM1CiAgICAvLyByZXR1cm4gQXNzZXRNaWNyb0xhYmVscygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA1IC8vIDUKICAgICsKICAgIHB1c2hieXRlcyAweDAwMDUKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3LTMzOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNyb19sYWJlbHMoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNyb0xhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm9fbGFiZWxzKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MS0zNDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfdGV4dChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldFRleHQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU0CiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEtMzU2CiAgICAvLyByZXR1cm4gQXNzZXRUZXh0KAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4LTM1OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjItMzYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dExhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzQKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcyLTM3NgogICAgLy8gcmV0dXJuIEFzc2V0VGV4dExhYmVscygKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgLy8gKQogICAgZGlnIDIKICAgIGxlbgogICAgcHVzaGludCA2IC8vIDYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc4LTM3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0X2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFRleHRMYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0X2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0X2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX3RleHRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dF9sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg5LTM5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk2CiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTkKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTItNDAwCiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMi00MDMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2LTQwNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEzLTQxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTgtNDIwCiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDE4CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIzCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDI0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjYKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjcKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjkKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMxCiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzQKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjItNDM1CiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIwCiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzctNDM4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MS00NDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "byteCode": { - "approval": "CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0ET1PCXQRVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/8WSb1FAUEASosCvkSL/3EFRIj58YsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQTwVJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/tooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==", + "approval": "CiAGAQACCP////8PgICAgBAmCwQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgIAAAAAAAAAAALRVJSOk5PRU1QVFkCAAExGEAABScEMQBnMRtBAoOCGASPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD8Epn8DwgSq7gxhBLbDn2gEY1vjYgRwk7ENBOG7lfwEVUC4CgSKQS+TBG8XzdUEekzkuQQ2bFGvBNXTutMEA7qY2zYaAI4YAcIBqgGYAYIBcwFbAUMBLQEVAP0A5wDUAMAAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAupIkMxGRREMRhENhoBF4gLkChMULAiQzEZFEQxGEQ2GgGICkoiQzEZFEQxGEQ2GgEXiAoxKExQsCJDMRkURDEYRDYaAYgJYSJDMRkURDEYRDYaAReICUgoTFCwIkMxGRREMRhENhoBiAjMIkMxGRREMRhENhoBF4gIsyhMULAiQzEZFEQxGEQ2GgGICAwiQzEZFEQxGEQ2GgEXiAfzKExQsCJDMRkURDEYRDYaAYgHcSJDMRkURDEYRDYaAReIB1goTFCwIkMxGRREMRhENhoBiAa+KExQsCJDMRkURDEYRDYaARfAMIgGkihMULAiQzEZFEQxGEQ2GgFXAgA2GgIXwDCIBaYiQzEZFEQxGEQ2GgFXAgA2GgIXwDCIBMciQzEZFEQxGEQ2GgEXwByIBKMoTFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiAONIkMxGRREMRhENhoBF8AcNhoCVwIAiAL8IkMxGRREMRhENhoBiAIlIkMxGRREMRhENhoBVwIAiAIAKExQsCJDMRkURDEYRDYaAVcCAIgBwyJDMRkURDEYRDYaAVcCADYaAlcCAIgBWiJDMRkURDEYRDYaARfAHIgBPCJDMRmNBgAT/hz+HP4cAAsAA0L+GTEYRIgBDSJDMRhEiAEBIkMxGBREIkOKAwGL/SNZSYv/CEwkCyQISwEWVwYCTgKL/SRLAlKL/yQLr1CL/RWL/U8DTwJSUIv+UEwkC0kjTIsDiwIMQQAjiwRJFlcGAosBiwNJTgRPAl1JjAFLAVkkCAiMBCQIjANC/9WLAIsBUIwAiYoEAStJi/4kC4v8JAsjiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAjjASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBi/8VFlcGAov/UImIAAWJiAABiTEAIycEZUQSQAAEJwewAImKAQCI/+onBIv/Z4mKAgCI/96L/r1FAUEABCcFsACL/hUkEkAADoAKRVJSOkxFTkdUSLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/42L/71FAUAAAymwAIv/vkRXAggnCKhAAAQnCbAAi/+8SImKAQGL/71FAUAAAymwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjJwRlRBJBAAGJi/+IAAGJigEAMQCL/4gAHEkhBRNBABGLACEEE0EACSJAAAQnB7AAiSNC//SKAgEjK0mL/r1FAUAABSEFjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PIQSMAImKAgCL/4j/Y4v/vUUBQAADKbAAi/69RQFBAEGL/ov/iP+EIQQSQAAEJwWwAIv+vkSL/xUWVwYCi/9QIoj9Uov+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnBkxQJwpMUIv+vEiL/ky/Qv/NigIAI0cEK0cCi/+I/uSL/71FAUAAAymwAIv+vUUBQAADKbAAi/6L/4j/AkmMByEEE0EAwosHIQUTQQC6IkAAAymwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJwioQQCJIkAABCcJsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiSqMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj8PowDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv90I0L/Q4oBAYv/vUUBQQAFi/++RIkqiYoCACNJK0mL/r1FAUAAAymwAIv+iP3ki/8WSYwBvUUBQQCIiwG9RQFAADkhBSEEEkAABCcFsACLAUm+RIv+FRZXBgKL/lAiiPvBSwG8SL+L/r5ESSRbIggWXAKL/rxIi/5Mv4mLAb5MSU4CjABEI1mMAiOMA4sDiwIMQQApiwBXAgCLAyQLSwFMWUpZJAhYVwIAi/4SQQAFiwNC/5CLAyIIjANC/88hBEL/gov+FRZXBgKL/lAnBkxQJwpMUIsBSbxITL9C/4iKAgAjRwMrRwKL/r1FAUAAAymwAIv+iP0bI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMpsACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90qjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+pCMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9/igEBi/8WSb1FAUEABosAvkRMiSpMiYoBASMqi/8jWSOLA4sCDEEATov/VwIAiwMlC1sWSYwAvUUBQQAiiwC+RCcGTFCLAUkjWUxXAgAiTwOI+oyMAYsDIgiMA0L/wosBSSNZTFcCACKABAACAACI+m6MAUL/34sBjACJigEBi/9xA0SI+tmL/3EBRBZJkyUORFcHAYACAANMUExQiYoBAYv/iP/WiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP+1sCIIjAFC/+CJigEBi/9xA0SI+oWL/3EBRBZJkyUORFcHAYv/Fkm9RQFBAB+LAr5EiwBJFYEFCIACAAWLAVBMFlcGAlBMUExQjACJKkL/4YoBAYv/iP+yiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP+RsCIIjAFC/+CJigEBi/9xBESI+g2L/3EDRIj6BYv/cQVEiPn9i/8WSb1FAUEAQosDvkSLAEkVJQhJFlcGAoACAAhMUIsBSU4DFU8CCEkWVwYCTwJMUIsCSU4DFU8CCBZXBgJQTwNQTwJQTFBMUIwAiSpC/76KAQGL/4j/jYmKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j/bLAiCIwBQv/giYoBAYv/cQREiPlwi/9xA0SI+WiL/3EFRIj5YEsCFYEGCEkWVwYCgAIABkxQSwMVTwIIFlcGAlBPA1BPAlBMUImKAQGL/4j/uImKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j/l7AiCIwBQv/giYoBAYv/cQREiPj+i/9xA0SI+PaL/3EBRBZJkyUORFcHAYv/cQBEFov/cQlEMgMTgAEAI08CVIv/cQpEMgMTgAEAI08CVIv/Fkm9RQFBAEGLBr5EiwBJFYEQCEkWVwYCgAIAEExQiwFJTgMVTwIITIsCUIsDUIsEUIsFI1OBaUxUTBZXBgJQTwJQTFBMUIwAiSpC/7+KAQGL/4j/ZImKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j/Q7AiCIwBQv/giYoBASNHC4v/cQhMSU8CRIv/cABFAUEA7osMi/9wAESL/3EERIj4HIwBi/9xA0SI+BKMAov/cQVEiPgIjAOL/3EARBaMBov/cQFEFkmTJQ5EVwcBjAWL/3EHTIwJRIv/cQlMjApEi/9xCkyMC0SL/3EITIwIRIv/cQZESRUWVwYCTFCMABaMB4v/FkmMBL1FAUEAb4sEvkSLAUkVgZsBCEkWVwYCgAIAm0xQiwJJTgMVTwIISRZXBgJPAkxQiwNJTgMVTwIITIsGUIsFUIsJUIsKUIsLUIsIUEsBFlcGAlCLAElOAxVPAghMiwdQTBZXBgJQTwRQTwNQTwJQTFBMUIwAiSpC/5EjQv8VigEBi/+I/u6JigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/s2wIgiMAUL/4Ik=", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts index 38b5729..ee11a6f 100644 --- a/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts +++ b/projects/asset_labeling-contracts/smart_contracts/artifacts/asset_labeling/AssetLabelingClient.ts @@ -24,7 +24,7 @@ import { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerR import { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk' import SimulateResponse = modelsv2.SimulateResponse -export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"labels","type":"string[]"},{"name":"url","type":"string"}],"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro_labels","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_text","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string[],string)","struct":"AssetText"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_text","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_small","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_small","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_full","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_full","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":[]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1107,1546,1565,1990],"errorMessage":"Index access is out of bounds"},{"pc":[287,302,322,337,357,372,392,407,427,442,462,481,503,527,551,573,597,621,636,658,676,700],"errorMessage":"OnCompletion is not NoOp"},{"pc":[2856],"errorMessage":"account opted into asset"},{"pc":[2274,2282,2358,2366,2478,2486,2508,2635,2643,2651,2665,2671,2686,2840,2861,2871,2881,2891,2899,2918,2926,2934,2942,2947],"errorMessage":"asset exists"},{"pc":[723],"errorMessage":"can only call when creating"},{"pc":[290,305,325,340,360,375,395,410,430,445,465,484,506,530,554,576,600,624,639,661,679,703],"errorMessage":"can only call when not creating"},{"pc":[981,1204],"errorMessage":"check self.admin exists"},{"pc":[1796,1846,1971,1982,2062,2160,2207,2389,2503,2710,2976],"errorMessage":"check self.assets entry exists"},{"pc":[1106,1142,1185,1421,1545,1819,2026],"errorMessage":"check self.labels entry exists"},{"pc":[1286,1395,1604,1629,1733],"errorMessage":"check self.operators entry exists"},{"pc":[2288,2372,2657,2905],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgIkVSUjpMRU5HVEgiIDB4MDAwMDAwMDAwMDAwMDAwMCAiRVJSOk5PRU1QVFkiIDB4MDAwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyNwogICAgcHVzaGJ5dGVzcyAweDhmMGQ3ZDhlIDB4N2MxYjMyZjYgMHgxN2U2OTFhZSAweDMzZDBmZmRjIDB4NzI1NjE2ZTcgMHhmYWMxY2YxYiAweGI0YzUwYjlmIDB4YTJkZDIyNDcgMHhhMzdkZWExMSAweDY4ZjE4ZWZhIDB4YzJlZDc0M2YgMHhhNjdmMDNjMiAweGFhZWUwYzYxIDB4YjZjMzlmNjggMHg2MzViZTM2MiAweDcwOTNiMTBkIDB4NGY1M2MyNWQgMHg1NTQwYjgwYSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZ1tdLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfc21hbGwodWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHVpbnQ2NCxib29sLGJvb2wsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX3NtYWxsKHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9mdWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyxzdHJpbmcsdWludDY0LHVpbnQ4LGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfZnVsbCh1aW50NjRbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANSBtYWluX2FkZF9sYWJlbF9yb3V0ZUA2IG1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDcgbWFpbl9nZXRfbGFiZWxfcm91dGVAOCBtYWluX2xvZ19sYWJlbHNfcm91dGVAOSBtYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMCBtYWluX3JlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX3JvdXRlQDExIG1haW5fZ2V0X29wZXJhdG9yX2xhYmVsc19yb3V0ZUAxMiBtYWluX2FkZF9sYWJlbF90b19hc3NldF9yb3V0ZUAxMyBtYWluX3JlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X3JvdXRlQDE0IG1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNSBtYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2IG1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3IG1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxOCBtYWluX2dldF9hc3NldF9taWNyb19sYWJlbHNfcm91dGVAMTkgbWFpbl9nZXRfYXNzZXRzX21pY3JvX2xhYmVsc19yb3V0ZUAyMCBtYWluX2dldF9hc3NldF90ZXh0X3JvdXRlQDIxIG1haW5fZ2V0X2Fzc2V0c190ZXh0X3JvdXRlQDIyIG1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNCBtYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1IG1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2CgptYWluX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19mdWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19mdWxsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9mdWxsX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2Z1bGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19zbWFsbF9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfc21hbGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3NtYWxsX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3NtYWxsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzA4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgbG9nX2xhYmVscwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfbGFiZWxfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2xhYmVsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9sYWJlbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VfYWRtaW5fcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1MQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGNoYW5nZV9hZG1pbgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTEKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzEgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5iMnN0cihiOiBieXRlcykgLT4gYnl0ZXM6CmIyc3RyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ2LTQ3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGIyc3RyKGI6IEJ5dGVzKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoU3RyaW5nLmZyb21fYnl0ZXMoYikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NjgtNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MQogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NAogICAgLy8gYXJjNC5TdHJpbmcobmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzMtNzcKICAgIC8vIHNlbGYubGFiZWxzW2lkXSA9IExhYmVsRGVzY3JpcHRvcigKICAgIC8vICAgICBhcmM0LlN0cmluZyhuYW1lKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMTIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfbGFiZWwoaWQ6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzktODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBpZDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODEKICAgIC8vIHNlbGYuYWRtaW5fb25seSgpCiAgICBjYWxsc3ViIGFkbWluX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGJ5dGVjIDggLy8gIkVSUjpMRU5HVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NAogICAgLy8gZW5zdXJlKHNlbGYubGFiZWxzW2lkXS5udW1fYXNzZXRzID09IDAsIFMoIkVSUjpOT0VNUFRZIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NQogICAgLy8gZGVsIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9sYWJlbChpZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODctODgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfbGFiZWwoc2VsZiwgaWQ6IFN0cmluZykgLT4gTGFiZWxEZXNjcmlwdG9yOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODkKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGdldF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4OQogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYubGFiZWxzW2lkXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5sb2dfbGFiZWxzKGlkczogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTItOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmxvZ19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBsb2dfbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5KHNlbGYsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIGlmIFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICBieiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCmFkbWluX29yX29wZXJhdG9yX29ubHlfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLm9wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgpvcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwNS0xMDYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA4CiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDgtMTEwCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkgIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBhbmQgc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoVHhuLnNlbmRlciwgbGFiZWwpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTEwCiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gYW5kIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKQogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwOC0xMTAKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KFR4bi5zZW5kZXIsIGxhYmVsKSAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYnogb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgpvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIFMoIkVSUjpVTkFVVEgiKSwKICAgIGJ5dGVjIDcgLy8gIkVSUjpVTkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCm9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgb3BlcmF0b3Jfb25seV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfS0VZKQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gcmV0dXJuIGlkeAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2Zvcl9oZWFkZXJAMwoKZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4X2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gcmV0dXJuIFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfb3BlcmF0b3JfdG9fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CmFkZF9vcGVyYXRvcl90b19sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfb3BlcmF0b3JfdG9fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI2CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gIyBjaGVjayBpZiBvcGVyYXRvciBleGlzdHMgYWxyZWFkeQogICAgLy8gaWYgb3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvciwgbGFiZWwpCiAgICAvLyA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzMKICAgIC8vIFMoIkVSUjpFWElTVFMiKSwKICAgIGJ5dGVjIDUgLy8gIkVSUjpFWElTVFMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzgKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBleGlzdGluZy5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gIyBpbmNyZW1lbnQgbGFiZWwgb3BlcmF0b3JzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ3CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0Ni0xNDgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQ5CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTQxLTE0MgogICAgLy8gIyBuZXcgb3BlcmF0b3IsIGNyZWF0ZSBuZXcgYm94CiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMSAvLyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwob3BlcmF0b3I6IGJ5dGVzLCBsYWJlbDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50LCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTMKICAgIC8vIHNlbGYuYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZG1pbl9vcl9vcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gZW5zdXJlKG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyAjIGVuc3VyZSBsYWJlbCBleGlzdHMgaW4gb3BlcmF0b3IKICAgIC8vIGxhYmVsX2lkeCA9IHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGxhYmVsX2lkeCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgZnJhbWVfZGlnIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjMKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgaW50YyA1IC8vIDQyOTQ5NjcyOTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjItMTYzCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTYxLTE2MwogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICAvLyBhbmQgbGFiZWxfaWR4CiAgICAvLyAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSksICAjIGtleSBjaGVjayByZWR1bmRhbnQsIGNoZWNrZWQgYWJvdmUKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gUygiRVJSOk5PRVhJU1QiKSwKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gIyBlbnN1cmUgb25seSBlbXB0eSBsYWJlbHMgY2FuIGJlIGxlZnQgb3BlcmF0b3ItbGVzcwogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycyA+IDEgb3IgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID09IDAsCiAgICBleHRyYWN0IDEwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDcKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gUygiRVJSOk5PRU1QVFkiKSwKICAgIGJ5dGVjIDEwIC8vICJFUlI6Tk9FTVBUWSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNwogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTczLTE3NgogICAgLy8gIyBkZWNyIG9wZXJhdG9yIGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9vcGVyYXRvcnMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzkKICAgIC8vIGlmIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5sZW5ndGggPT0gMToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gZGVsIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfZWxzZV9ib2R5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gbmV4dF9saXN0ID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODMtMTg2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyBleGNlcHQgaW5kZXgKICAgIC8vICMgdGhpcyBpbXBsZW1lbnRhdGlvbiB3YWxrcyB0d2ljZSAob25jZSBpbiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgpCiAgICAvLyAjIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50CiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTgzLTE4NgogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPAogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfZm9yQDE2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gaWYgbGFiZWxfaWR4ICE9IGlkeDoKICAgIGZyYW1lX2RpZyA3CiAgICAhPQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Zvcl9oZWFkZXJAMTEKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IG5leHRfbGlzdC5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VAOAoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X29wZXJhdG9yX2xhYmVscyhvcGVyYXRvcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfb3BlcmF0b3JfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Mi0xOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxzKHNlbGYsIG9wZXJhdG9yOiBBY2NvdW50KSAtPiBMYWJlbExpc3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTQKICAgIC8vIGlmIG9wZXJhdG9yIGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKZ2V0X29wZXJhdG9yX2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTYtMTk3CiAgICAvLyAjIHJldHVybiBlbXB0eSBsaXN0CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZGRfbGFiZWxfdG9fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgphZGRfbGFiZWxfdG9fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYWRkX2xhYmVsX3RvX2Fzc2V0KHNlbGYsIGxhYmVsOiBTdHJpbmcsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEwCiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gaWYgYXNzZXQgbm90IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIGludGMgNSAvLyA0Mjk0OTY3Mjk2CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE4CiAgICAvLyBTKCJFUlI6RVhJU1RTIiksCiAgICBieXRlYyA1IC8vICJFUlI6RVhJU1RTIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGV4aXN0aW5nLmFwcGVuZChhcmM0LlN0cmluZyhsYWJlbCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI0CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBleGlzdGluZy5jb3B5KCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjI5LTIzMAogICAgLy8gIyBpbmNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMyCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzEtMjMzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlICsgVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM0CiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDMKCmFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBpZiBzdG9yZWRfbGFiZWwgPT0gbGFiZWw6CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE3CiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2Zvcl9oZWFkZXJANwoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDYKICAgIC8vIHJldHVybiBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKQogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4KGFzc2V0LCBsYWJlbCkgPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9sYWJlbF9pbmRleEAxMgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgbmV3IG9wZXJhdG9yLCBjcmVhdGUgbmV3IGJveAogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTEgLy8gMHgwMDAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcucmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQobGFiZWw6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB2b2lkOgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzYtMjM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlZiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNgogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDQKICAgIC8vIGlmIHNlbGYuYXNzZXRzW2Fzc2V0XVswXSA9PSBsYWJlbDoKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gZGVsIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA1CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBpZiBub3QgY29uZDoKICAgIGZyYW1lX2RpZyA1CiAgICBibnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gZW5zdXJlKGZvdW5kLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjMtMjY0CiAgICAvLyAjIGRlY3IgYXNzZXQgY291bnQKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjYKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NS0yNjcKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIGxhYmVsX2Rlc2NyaXB0b3IubnVtX2Fzc2V0cy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIC8vICkKICAgIGl0b2IKICAgIHJlcGxhY2UyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjgKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTAKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUxLTI1MwogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgdG8gbmV3IGJveCBleGNlcHQgbGFiZWwKICAgIC8vICMgc2F2ZSAkZm91bmQgdG8gdGhyb3cgaWYgbm90IGZvdW5kCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLmFzc2V0c1thc3NldF0pOgogICAgZnJhbWVfZGlnIDMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1MS0yNTMKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gaWYgc3RvcmVkX2xhYmVsICE9IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgIT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU1CiAgICAvLyBuZXh0X2xpc3QuYXBwZW5kKHN0b3JlZF9sYWJlbCkKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZnJhbWVfYnVyeSAxCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwOgogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZm9yX2hlYWRlckA2CgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTcKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEwCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9mb3JAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyBzZWxmLmFzc2V0c1thc3NldF0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbGFiZWxzKHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldF9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldHNbYXNzZXRdCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmV0c3ViCgpnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vICMgcmV0dXJuIGVtcHR5CiAgICAvLyByZXR1cm4gZW1wdHlfbGlzdCgpCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2Fzc2V0c19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc3LTI4MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbGFiZWxzKAogICAgLy8gICAgIHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdCiAgICAvLyApIC0+IGFyYzQuRHluYW1pY0FycmF5W0xhYmVsTGlzdF06CiAgICBwcm90byAxIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBvdXQgPSBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgyCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2ZvckA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIGFzc2V0ID0gQXNzZXQoYXNzZXRfaWQubmF0aXZlKQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODQKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0X2Fzc2V0c19sYWJlbHNfZWxzZV9ib2R5QDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODUKICAgIC8vIG91dC5hcHBlbmQoc2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRfYXNzZXRzX2xhYmVsc19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gb3V0LmFwcGVuZChlbXB0eV9saXN0KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1CgpnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiBvdXQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2LTI5NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDEKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTktMzAyCiAgICAvLyByZXR1cm4gQXNzZXRNaWNybygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbWljcm8oYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvKHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0TWljcm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDYKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNybwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNybyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOC0zMDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm8oYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX21pY3JvX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0TWljcm9MYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTkKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjAKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxOC0zMjIKICAgIC8vIHJldHVybiBBc3NldE1pY3JvTGFiZWxzKAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDUgLy8gNQogICAgKwogICAgcHVzaGJ5dGVzIDB4MDAwNQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGIgX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X21pY3JvX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjQtMzI1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfbWljcm9fbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMwCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dChhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF90ZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDAKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDIKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQxCiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOC0zNDMKICAgIC8vIHJldHVybiBBc3NldFRleHQoCiAgICAvLyAgICAgbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDktMzUwCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUxCiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU2LTM1NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjAKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYzCiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjYKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTktMzY3CiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2OS0zNzAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzczLTM3NAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgwLTM4MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODYKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUtMzg3CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg1CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkwCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzkxCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTIKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTYKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDEKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODktNDAyCiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg3CiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDQtNDA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOC00MDkKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTAKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxMAogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTEKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAGAQACCP////8PgICAgBAmDAQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgKRVJSOkxFTkdUSAgAAAAAAAAAAAtFUlI6Tk9FTVBUWQIAATEYQAAFJwQxAGcxG0ECUoIWBI8NfY4EfBsy9gQX5pGuBDPQ/9wEclYW5wT6wc8bBLTFC58Eot0iRwSjfeoRBGjxjvoEwu10PwSmfwPCBKruDGEEtsOfaARjW+NiBHCTsQ0ET1PCXQRVQLgKBHpM5LkENmxRrwTV07rTBAO6mNs2GgCOFgGfAYcBdQFfAVABOAEgAQoA8gDaAMQAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAr0IkMxGRREMRhENhoBF4gK2yhMULAiQzEZFEQxGEQ2GgGICZUiQzEZFEQxGEQ2GgEXiAl8KExQsCJDMRkURDEYRDYaAYgIrCJDMRkURDEYRDYaAReICJMoTFCwIkMxGRREMRhENhoBiAfsIkMxGRREMRhENhoBF4gH0yhMULAiQzEZFEQxGEQ2GgGIB1EiQzEZFEQxGEQ2GgEXiAc4KExQsCJDMRkURDEYRDYaAYgGnihMULAiQzEZFEQxGEQ2GgEXwDCIBnIoTFCwIkMxGRREMRhENhoBVwIANhoCF8AwiAWGIkMxGRREMRhENhoBVwIANhoCF8AwiASnIkMxGRREMRhENhoBF8AciASDKExQsCJDMRkURDEYRDYaARfAHDYaAlcCAIgDbSJDMRkURDEYRDYaARfAHDYaAlcCAIgC3CJDMRkURDEYRDYaAYgCASJDMRkURDEYRDYaAVcCAIgB3ChMULAiQzEZFEQxGEQ2GgFXAgCIAZMiQzEZFEQxGEQ2GgFXAgA2GgJXAgCIATQiQzEZFEQxGEQ2GgEXwByIARYiQzEZQP5KMRgURCJDigMBi/0jWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJI0yLA4sCDEEAI4sESRZXBgKLAYsDSU4ETwJdSYwBSwFZJAgIjAQkCIwDQv/ViwCLAVCMAImKBAErSYv+JAuL/CQLI4sEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAI4wEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoBAYv/FRZXBgKL/1CJMQAjJwRlRBJAAAQnB7AAiYoBAIj/6icEi/9niYoCAIj/3ov+vUUBQQAEJwWwAIv+FSQSQAAEJwiwAIv/FRZXBgKL/1CAEgASAAAAAAAAAAAAAAAAAAAAAExQi/68SIv+TL+JigEAiP+Xi/+9RQFAAAMpsACL/xUkEkAABCcIsACL/75EVwIIJwmoQAAEJwqwAIv/vEiJigEBi/+9RQFAAAMpsACL/75EiYoBAIv/I1kjiwGLAAxBACKL/1cCAIsBSU4CJAtLAUxZSlkkCFhXAgC+RLAiCIwBQv/WiYoBADEAIycEZUQSQQABiYv/iAABiYoBADEAi/+IACAhBRNBABYxAIv/iAATIQQTQQAJIkAABCcHsACJI0L/9IoCASMrSYv+vUUBQAAFIQWMAImL/r5MSU4CjABEI1mMASOMAosCiwEMQQApiwBXAgCLAiQLSwFMWUpZJAhYVwIAi/8SQQAFiwKMAImLAiIIjAJC/88hBIwAiYoCAIv/iP9fi/+9RQFAAAMpsACL/r1FAUEAQYv+i/+I/4QhBBJAAAQnBbAAi/6+RIv/FRZXBgKL/1AiiP1Ui/68SIv+TL+L/75ESYEKWyIIFlwKi/+8SIv/TL+Ji/8VFlcGAov/UCcGTFAnC0xQi/68SIv+TL9C/82KAgAjRwQrRwKL/4j+4Iv/vUUBQAADKbAAi/69RQFAAAMpsACL/ov/iP8CSYwHIQQTQQDCiwchBRNBALoiQAADKbAAi/++TElOAowARFcKCIAIAAAAAAAAAAGlQAALiwBXAggnCahBAIkiQAAEJwqwAIsASYEKWyIJFlwKi/+8SIv/TL+L/r5EI1kiEkEABYv+vEiJKowCi/6+TElOAowBRCNZjAUjjAaLBosFDEEAOIsBVwIAiwZJTgIkC0sBTFlKWSQIWIwEiwcTiwKMA0EACosCiwQiiPxAjAOLA4wCiwYiCIwGQv/Ai/68SIv+iwK/iSNC/3QjQv9DigEBi/+9RQFBAAWL/75EiSqJigIAI0krSYv+vUUBQAADKbAAi/6I/eCL/xZJjAG9RQFBAIiLAb1FAUAAOSEFIQQSQAAEJwWwAIsBSb5Ei/4VFlcGAov+UCKI+8NLAbxIv4v+vkRJJFsiCBZcAov+vEiL/ky/iYsBvkxJTgKMAEQjWYwCI4wDiwOLAgxBACmLAFcCAIsDJAtLAUxZSlkkCFhXAgCL/hJBAAWLA0L/kIsDIgiMA0L/zyEEQv+Ci/4VFlcGAov+UCcGTFAnC0xQiwFJvEhMv0L/iIoCACNHAytHAov+vUUBQAADKbAAi/6I/RcjjAWL/xZJjAO+RCNZIhJBAEeLA75ESVcCAEwjWURJI1lKWSQIWFcCAIv+EkEAJIsDvEgijAWLBUAAAymwAIv+vkRJJFsiCRZcAov+vEiL/ky/iSOMBUL/3SqMAYsDvkxJTgKMAEQjWYwEI4wGiwaLBAxBADeLAFcCAIsGJAtLAUxZSlkkCFhJjAJXAgCL/hNBABOLAYsCIoj6kowBiwYiCIwGQv/HIowFQv/xiwNJvEiLAb9C/3+KAQGL/xZJvUUBQQAGiwC+REyJKkyJigEBIyqL/yNZI4sDiwIMQQBOi/9XAgCLAyULWxZJjAC9RQFBACKLAL5EJwZMUIsBSSNZTFcCACJPA4j6jowBiwMiCIwDQv/CiwFJI1lMVwIAIoAEAAIAAIj6cIwBQv/fiwGMAImKAQGL/3EDRIj624v/cQFEFkmTJQ5EVwcBgAIAA0xQTFCJigEBi/+I/9aJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/7WwIgiMAUL/4ImKAQGL/3EDRIj6h4v/cQFEFkmTJQ5EVwcBi/8WSb1FAUEAH4sCvkSLAEkVgQUIgAIABYsBUEwWVwYCUExQTFCMAIkqQv/higEBi/+I/7KJigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/5GwIgiMAUL/4ImKAQGL/3EERIj6D4v/cQNEiPoHi/8WSb1FAUEASosCvkSL/3EFRIj58YsASRUlCEkWVwYCgAIACExQiwFJTgMVTwIISRZXBgJPAkxQTwVJTgMVTwIIFlcGAlBPA1BPAlBMUExQjACJKkL/tooBAYv/iP+NiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9ssCIIjAFC/+CJigEBi/9xBESI+XKL/3EDRIj5aov/cQFEFkmTJQ5EVwcBi/9xAEQWi/9xCUQyAxOAAQAjTwJUi/9xCkQyAxOAAQAjTwJUi/8WSb1FAUEAQYsGvkSLAEkVgRAISRZXBgKAAgAQTFCLAUlOAxVPAghMiwJQiwNQiwRQiwUjU4FpTFRMFlcGAlBPAlBMUExQjACJKkL/v4oBAYv/iP9kiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP9DsCIIjAFC/+CJigEBI0cLi/9xCExJTwJEi/9wAEUBQQDuiwyL/3AARIv/cQREiPiQjAGL/3EDRIj4howCi/9xBUSI+HyMA4v/cQBEFowGi/9xAUQWSZMlDkRXBwGMBYv/cQdMjAlEi/9xCUyMCkSL/3EKTIwLRIv/cQhMjAhEi/9xBkRJFRZXBgJMUIwAFowHi/8WSYwEvUUBQQBviwS+RIsBSRWBmwEISRZXBgKAAgCbTFCLAklOAxVPAghJFlcGAk8CTFCLA0lOAxVPAghMiwZQiwVQiwlQiwpQiwtQiwhQSwEWVwYCUIsASU4DFU8CCEyLB1BMFlcGAlBPBFBPA1BPAlBMUExQjACJKkL/kSNC/xWKAQGL/4j+7omKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j+zbAiCIwBQv/giQ==","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract +export const APP_SPEC: Arc56Contract = {"name":"AssetLabeling","structs":{"AssetFull":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"total","type":"uint64"},{"name":"decimals","type":"uint8"},{"name":"manager","type":"address"},{"name":"freeze","type":"address"},{"name":"clawback","type":"address"},{"name":"reserve","type":"address"},{"name":"metadataHash","type":"byte[]"},{"name":"reserveBalance","type":"uint64"},{"name":"labels","type":"string[]"}],"AssetMicro":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"}],"AssetMicroLabels":[{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"labels","type":"string[]"}],"AssetSmall":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"decimals","type":"uint8"},{"name":"total","type":"uint64"},{"name":"hasFreeze","type":"bool"},{"name":"hasClawback","type":"bool"},{"name":"labels","type":"string[]"}],"AssetText":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"},{"name":"labels","type":"string[]"}],"AssetTextLabels":[{"name":"name","type":"string"},{"name":"unitName","type":"string"},{"name":"url","type":"string"}],"LabelDescriptor":[{"name":"name","type":"string"},{"name":"numAssets","type":"uint64"},{"name":"numOperators","type":"uint64"}]},"methods":[{"name":"change_admin","args":[{"type":"account","name":"new_admin"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"add_label","args":[{"type":"string","name":"id"},{"type":"string","name":"name"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label","args":[{"type":"string","name":"id"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_label","args":[{"type":"string","name":"id"}],"returns":{"type":"(string,uint64,uint64)","struct":"LabelDescriptor"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"log_labels","args":[{"type":"string[]","name":"ids"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_operator_to_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_operator_from_label","args":[{"type":"account","name":"operator"},{"type":"string","name":"label"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_operator_labels","args":[{"type":"account","name":"operator"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"add_label_to_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"remove_label_from_asset","args":[{"type":"string","name":"label"},{"type":"asset","name":"asset"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":false,"events":[],"recommendations":{}},{"name":"get_asset_labels","args":[{"type":"asset","name":"asset"}],"returns":{"type":"string[]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"string[][]"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8)","struct":"AssetMicro"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_micro_labels","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,uint8,string[])","struct":"AssetMicroLabels"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_micro_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_text","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,string[])","struct":"AssetText"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_text","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_text_labels","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string)","struct":"AssetTextLabels"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_text_labels","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_small","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,uint8,uint64,bool,bool,string[])","struct":"AssetSmall"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_small","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_asset_full","args":[{"type":"uint64","name":"asset"}],"returns":{"type":"(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])","struct":"AssetFull"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}},{"name":"get_assets_full","args":[{"type":"uint64[]","name":"assets"}],"returns":{"type":"void"},"actions":{"create":[],"call":["NoOp"]},"readonly":true,"events":[],"recommendations":{}}],"arcs":[22,28],"networks":{},"state":{"schema":{"global":{"ints":0,"bytes":1},"local":{"ints":0,"bytes":0}},"keys":{"global":{"admin":{"keyType":"AVMString","valueType":"AVMBytes","key":"YWRtaW4="}},"local":{},"box":{}},"maps":{"global":{},"local":{},"box":{"labels":{"keyType":"AVMString","valueType":"LabelDescriptor","prefix":""},"assets":{"keyType":"AVMUint64","valueType":"string[]","prefix":""},"operators":{"keyType":"AVMBytes","valueType":"string[]","prefix":""}}}},"bareActions":{"create":["NoOp"],"call":["DeleteApplication","UpdateApplication"]},"sourceInfo":{"approval":{"sourceInfo":[{"pc":[1181,1616,1635,2060],"errorMessage":"Index access is out of bounds"},{"pc":[290,305,325,340,360,375,395,410,430,445,465,480,500,519,541,565,589,611,635,659,674,696,714,738],"errorMessage":"OnCompletion is not NoOp"},{"pc":[3040],"errorMessage":"account opted into asset"},{"pc":[2344,2352,2428,2436,2548,2556,2564,2705,2713,2721,2819,2827,2835,2849,2855,2870,3024,3045,3055,3065,3075,3083,3102,3110,3118,3126,3131],"errorMessage":"asset exists"},{"pc":[791],"errorMessage":"can only call when creating"},{"pc":[293,308,328,343,363,378,398,413,433,448,468,483,503,522,544,568,592,614,638,662,677,699,717,741,774,782],"errorMessage":"can only call when not creating"},{"pc":[1057,1278],"errorMessage":"check self.admin exists"},{"pc":[1866,1916,2041,2052,2132,2230,2277,2459,2581,2894,3160],"errorMessage":"check self.assets entry exists"},{"pc":[1180,1216,1259,1491,1615,1889,2096],"errorMessage":"check self.labels entry exists"},{"pc":[1356,1465,1674,1699,1803],"errorMessage":"check self.operators entry exists"},{"pc":[2358,2442,2841,3089],"errorMessage":"overflow"}],"pcOffsetMethod":"none"},"clear":{"sourceInfo":[],"pcOffsetMethod":"none"}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA4IDQyOTQ5NjcyOTUgNDI5NDk2NzI5NgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJFUlI6Tk9FWElTVCIgMHgwMDAwICIiICJhZG1pbiIgIkVSUjpFWElTVFMiIDB4MDAwMiAiRVJSOlVOQVVUSCIgMHgwMDAwMDAwMDAwMDAwMDAwICJFUlI6Tk9FTVBUWSIgMHgwMDAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTcKICAgIC8vIHNlbGYuYWRtaW4gPSBUeG4uc2VuZGVyCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI5CiAgICBwdXNoYnl0ZXNzIDB4OGYwZDdkOGUgMHg3YzFiMzJmNiAweDE3ZTY5MWFlIDB4MzNkMGZmZGMgMHg3MjU2MTZlNyAweGZhYzFjZjFiIDB4YjRjNTBiOWYgMHhhMmRkMjI0NyAweGEzN2RlYTExIDB4NjhmMThlZmEgMHhjMmVkNzQzZiAweGE2N2YwM2MyIDB4YWFlZTBjNjEgMHhiNmMzOWY2OCAweDYzNWJlMzYyIDB4NzA5M2IxMGQgMHhlMWJiOTVmYyAweDU1NDBiODBhIDB4OGE0MTJmOTMgMHg2ZjE3Y2RkNSAweDdhNGNlNGI5IDB4MzY2YzUxYWYgMHhkNWQzYmFkMyAweDAzYmE5OGRiIC8vIG1ldGhvZCAiY2hhbmdlX2FkbWluKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYWRkX2xhYmVsKHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAicmVtb3ZlX2xhYmVsKHN0cmluZyl2b2lkIiwgbWV0aG9kICJnZXRfbGFiZWwoc3RyaW5nKShzdHJpbmcsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19sYWJlbHMoc3RyaW5nW10pdm9pZCIsIG1ldGhvZCAiYWRkX29wZXJhdG9yX3RvX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgInJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsKGFjY291bnQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImdldF9vcGVyYXRvcl9sYWJlbHMoYWNjb3VudClzdHJpbmdbXSIsIG1ldGhvZCAiYWRkX2xhYmVsX3RvX2Fzc2V0KHN0cmluZyxhc3NldCl2b2lkIiwgbWV0aG9kICJyZW1vdmVfbGFiZWxfZnJvbV9hc3NldChzdHJpbmcsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19sYWJlbHModWludDY0W10pc3RyaW5nW11bXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21pY3JvKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNybyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfbWljcm9fbGFiZWxzKHVpbnQ2NCkoc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19taWNyb19sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3RleHQodWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfdGV4dF9sYWJlbHModWludDY0KShzdHJpbmcsc3RyaW5nLHN0cmluZykiLCBtZXRob2QgImdldF9hc3NldHNfdGV4dF9sYWJlbHModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X3NtYWxsKHVpbnQ2NCkoc3RyaW5nLHN0cmluZyx1aW50OCx1aW50NjQsYm9vbCxib29sLHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0c19zbWFsbCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfZnVsbCh1aW50NjQpKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ2NCx1aW50OCxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGJ5dGVbXSx1aW50NjQsc3RyaW5nW10pIiwgbWV0aG9kICJnZXRfYXNzZXRzX2Z1bGwodWludDY0W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY2hhbmdlX2FkbWluX3JvdXRlQDUgbWFpbl9hZGRfbGFiZWxfcm91dGVANiBtYWluX3JlbW92ZV9sYWJlbF9yb3V0ZUA3IG1haW5fZ2V0X2xhYmVsX3JvdXRlQDggbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDkgbWFpbl9hZGRfb3BlcmF0b3JfdG9fbGFiZWxfcm91dGVAMTAgbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMSBtYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTIgbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTMgbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNCBtYWluX2dldF9hc3NldF9sYWJlbHNfcm91dGVAMTUgbWFpbl9nZXRfYXNzZXRzX2xhYmVsc19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9taWNyb19yb3V0ZUAxNyBtYWluX2dldF9hc3NldHNfbWljcm9fcm91dGVAMTggbWFpbl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfcm91dGVAMjAgbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMSBtYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMiBtYWluX2dldF9hc3NldF90ZXh0X2xhYmVsc19yb3V0ZUAyMyBtYWluX2dldF9hc3NldHNfdGV4dF9sYWJlbHNfcm91dGVAMjQgbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjUgbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjcgbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjgKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX2Z1bGxfcm91dGVAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDQxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRzX2Z1bGwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2Z1bGxfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfZnVsbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRzX3NtYWxsX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19zbWFsbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfc21hbGxfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYXNzZXRfc21hbGwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzgyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dF9sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X3RleHRfbGFiZWxzX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X3RleHRfbGFiZWxzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfdGV4dF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzYyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfdGV4dAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfdGV4dF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF90ZXh0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbWljcm9fbGFiZWxzX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19taWNyb19sYWJlbHMKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVsc19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldF9taWNyb19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0c19taWNyb19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hc3NldHNfbWljcm8KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21pY3JvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMTcKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21pY3JvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldHNfbGFiZWxzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTAKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0c19sYWJlbHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2xhYmVsc19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfbGFiZWxfdG9fYXNzZXRfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsX3RvX2Fzc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9vcGVyYXRvcl9sYWJlbHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVscwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZF9vcGVyYXRvcl90b19sYWJlbF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF9vcGVyYXRvcl90b19sYWJlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2dfbGFiZWxzX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBsb2dfbGFiZWxzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9sYWJlbF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5OAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfbGFiZWwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlX2xhYmVsX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiByZW1vdmVfbGFiZWwKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkX2xhYmVsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTUKICAgIC8vIGNsYXNzIEFzc2V0TGFiZWxpbmcoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkX2xhYmVsCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZV9hZG1pbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBjbGFzcyBBc3NldExhYmVsaW5nKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgY2hhbmdlX2FkbWluCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo1NQogICAgLy8gY2xhc3MgQXNzZXRMYWJlbGluZyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMyBtYWluX2FmdGVyX2lmX2Vsc2VAMzMgbWFpbl91cGRhdGVAMzAgbWFpbl9kZWxldGVAMzEKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMzCgptYWluX2RlbGV0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2MwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdXBkYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMyOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMSAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LmIyc3RyKGI6IGJ5dGVzKSAtPiBieXRlczoKYjJzdHI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYjJzdHIoYjogQnl0ZXMpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NTIKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZyhTdHJpbmcuZnJvbV9ieXRlcyhiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnVwZGF0ZSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo2NQogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZGVsZXRlKCkgLT4gdm9pZDoKZGVsZXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBzZWxmLmFkbWluX29ubHkoKQogICAgY2FsbHN1YiBhZG1pbl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5hZG1pbl9vbmx5KCkgLT4gdm9pZDoKYWRtaW5fb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRtaW5fb25seV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3MwogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT0gc2VsZi5hZG1pbiwgUygiRVJSOlVOQVVUSCIpKQogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZG1pbl9vbmx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmNoYW5nZV9hZG1pbihuZXdfYWRtaW46IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VfYWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NzUtNzYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGNoYW5nZV9hZG1pbihzZWxmLCBuZXdfYWRtaW46IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBzZWxmLmFkbWluID0gbmV3X2FkbWluCiAgICBieXRlYyA0IC8vICJhZG1pbiIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9sYWJlbChpZDogYnl0ZXMsIG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphZGRfbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6ODAtODEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbChzZWxmLCBpZDogU3RyaW5nLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MgogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBlbnN1cmUoaWQgbm90IGluIHNlbGYubGFiZWxzLCBTKCJFUlI6RVhJU1RTIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJ6IGFkZF9sYWJlbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4MwogICAgLy8gZW5zdXJlKGlkIG5vdCBpbiBzZWxmLmxhYmVscywgUygiRVJSOkVYSVNUUyIpKQogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBlbnN1cmUoaWQuYnl0ZXMubGVuZ3RoID09IDIsIFMoIkVSUjpMRU5HVEgiKSkKICAgIHB1c2hieXRlcyAiRVJSOkxFTkdUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBhcmM0LlN0cmluZyhuYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo4NS04OQogICAgLy8gc2VsZi5sYWJlbHNbaWRdID0gTGFiZWxEZXNjcmlwdG9yKAogICAgLy8gICAgIGFyYzQuU3RyaW5nKG5hbWUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGFyYzQuVUludDY0KDApLAogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4MDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbChpZDogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZV9sYWJlbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MS05MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5hZG1pbl9vbmx5KCkKICAgIGNhbGxzdWIgYWRtaW5fb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBlbnN1cmUoaWQgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfbGFiZWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTQKICAgIC8vIGVuc3VyZShpZCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTUKICAgIC8vIGVuc3VyZShzZWxmLmxhYmVsc1tpZF0ubnVtX2Fzc2V0cyA9PSAwLCBTKCJFUlI6Tk9FTVBUWSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogcmVtb3ZlX2xhYmVsX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBlbnN1cmUoc2VsZi5sYWJlbHNbaWRdLm51bV9hc3NldHMgPT0gMCwgUygiRVJSOk5PRU1QVFkiKSkKICAgIGJ5dGVjIDkgLy8gIkVSUjpOT0VNUFRZIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6OTYKICAgIC8vIGRlbCBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfbGFiZWwoaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5Ojk4LTk5CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2xhYmVsKHNlbGYsIGlkOiBTdHJpbmcpIC0+IExhYmVsRGVzY3JpcHRvcjoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gZW5zdXJlKGlkIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKZ2V0X2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLmxhYmVsc1tpZF0KICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcubG9nX2xhYmVscyhpZHM6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEwMy0xMDQKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBsb2dfbGFiZWxzKHNlbGYsIGlkczogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTA1CiAgICAvLyBmb3IgX2lkeCwgbGFiZWxfaWQgaW4gdWVudW1lcmF0ZShpZHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGZvciBfaWR4LCBsYWJlbF9pZCBpbiB1ZW51bWVyYXRlKGlkcyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGxvZ19sYWJlbHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMDYKICAgIC8vIGxvZyhzZWxmLmxhYmVsc1tsYWJlbF9pZC5uYXRpdmVdKQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBsb2dfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKbG9nX2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkbWluX29yX29wZXJhdG9yX29ubHkobGFiZWw6IGJ5dGVzKSAtPiB2b2lkOgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRtaW5fb3Jfb3BlcmF0b3Jfb25seShzZWxmLCBsYWJlbDogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTE0CiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW46CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYnogYWRtaW5fb3Jfb3BlcmF0b3Jfb25seV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZG1pbl9vcl9vcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTYKICAgIC8vIHNlbGYub3BlcmF0b3Jfb25seShsYWJlbCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBvcGVyYXRvcl9vbmx5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5vcGVyYXRvcl9vbmx5KGxhYmVsOiBieXRlcykgLT4gdm9pZDoKb3BlcmF0b3Jfb25seToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG9wZXJhdG9yX29ubHkoc2VsZiwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMAogICAgLy8gb3BlcmF0b3JfaW5kZXggPSBzZWxmLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChUeG4uc2VuZGVyLCBsYWJlbCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMjItMTIzCiAgICAvLyBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX0tFWSkKICAgIC8vIGFuZCBvcGVyYXRvcl9pbmRleCAhPSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGJ6IG9wZXJhdG9yX29ubHlfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA0IC8vIDQyOTQ5NjcyOTUKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICAvLyBhbmQgb3BlcmF0b3JfaW5kZXggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBieiBvcGVyYXRvcl9vbmx5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCm9wZXJhdG9yX29ubHlfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gUygiRVJSOlVOQVVUSCIpLAogICAgYnl0ZWMgNyAvLyAiRVJSOlVOQVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpvcGVyYXRvcl9vbmx5X2FmdGVyX2lmX2Vsc2VANzoKICAgIHJldHN1YgoKb3BlcmF0b3Jfb25seV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBvcGVyYXRvcl9vbmx5X2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdWludDY0OgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTI3LTEyOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gaWYgb3BlcmF0b3Igbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMwCiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9mb3JfaGVhZGVyQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMxCiAgICAvLyBmb3IgaWR4LCBzdG9yZWRfbGFiZWwgaW4gdWVudW1lcmF0ZShzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0pOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzIKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCA9PSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXR1cm4gaWR4CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbF9pbmRleF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfZm9yX2hlYWRlckAzCgpnZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXhfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM0CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmFkZF9vcGVyYXRvcl90b19sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKYWRkX29wZXJhdG9yX3RvX2xhYmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzNi0xMzcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9vcGVyYXRvcl90b19sYWJlbChzZWxmLCBvcGVyYXRvcjogQWNjb3VudCwgbGFiZWw6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxMzkKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTM5CiAgICAvLyBlbnN1cmUobGFiZWwgaW4gc2VsZi5sYWJlbHMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDAtMTQxCiAgICAvLyAjIGNoZWNrIGlmIG9wZXJhdG9yIGV4aXN0cyBhbHJlYWR5CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfb3BlcmF0b3JfdG9fbGFiZWxfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNDQKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSksCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIHNlbGYuZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KG9wZXJhdG9yLCBsYWJlbCkKICAgIC8vID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfb3BlcmF0b3JfdG9fbGFiZWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vICMgYWRkIGxhYmVsIHRvIG9wZXJhdG9yCiAgICAvLyBleGlzdGluZyA9IHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3BlcmF0b3JzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZXhpc3RpbmcuYXBwZW5kKGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTIKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGV4aXN0aW5nLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAoKYWRkX29wZXJhdG9yX3RvX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyAjIGluY3JlbWVudCBsYWJlbCBvcGVyYXRvcnMKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IgPSBzZWxmLmxhYmVsc1tsYWJlbF0uY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxhYmVscyBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjAKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgKyBVSW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTU5LTE2MQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjIKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCmFkZF9vcGVyYXRvcl90b19sYWJlbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFkZF9vcGVyYXRvcl90b19sYWJlbF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5yZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbChvcGVyYXRvcjogYnl0ZXMsIGxhYmVsOiBieXRlcykgLT4gdm9pZDoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY0LTE2NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWwoc2VsZiwgb3BlcmF0b3I6IEFjY291bnQsIGxhYmVsOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5hZG1pbl9vcl9vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkbWluX29yX29wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNjgKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTY5CiAgICAvLyBlbnN1cmUob3BlcmF0b3IgaW4gc2VsZi5vcGVyYXRvcnMsIFMoIkVSUjpOT0VYSVNUIikpCiAgICBieXRlY18xIC8vICJFUlI6Tk9FWElTVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vICMgZW5zdXJlIGxhYmVsIGV4aXN0cyBpbiBvcGVyYXRvcgogICAgLy8gbGFiZWxfaWR4ID0gc2VsZi5nZXRfb3BlcmF0b3JfbGFiZWxfaW5kZXgob3BlcmF0b3IsIGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gbGFiZWxfaWR4ICE9IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpCiAgICBpbnRjIDQgLy8gNDI5NDk2NzI5NQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc1LTE3NgogICAgLy8gYW5kIGxhYmVsX2lkeAogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBmcmFtZV9kaWcgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gIT0gVUludDY0KE5PVF9GT1VORF9LRVkpLCAgIyBrZXkgY2hlY2sgcmVkdW5kYW50LCBjaGVja2VkIGFib3ZlCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE3NS0xNzYKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxNzQtMTc2CiAgICAvLyBsYWJlbF9pZHggIT0gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIC8vIGFuZCBsYWJlbF9pZHgKICAgIC8vICE9IFVJbnQ2NChOT1RfRk9VTkRfS0VZKSwgICMga2V5IGNoZWNrIHJlZHVuZGFudCwgY2hlY2tlZCBhYm92ZQogICAgYnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTc3CiAgICAvLyBTKCJFUlI6Tk9FWElTVCIpLAogICAgYnl0ZWNfMSAvLyAiRVJSOk5PRVhJU1QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODAtMTgxCiAgICAvLyAjIGVuc3VyZSBvbmx5IGVtcHR5IGxhYmVscyBjYW4gYmUgbGVmdCBvcGVyYXRvci1sZXNzCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID4gMSBvciBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPT0gMCwKICAgIGV4dHJhY3QgMTAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI+CiAgICBibnogcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VANwoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTg0CiAgICAvLyBTKCJFUlI6Tk9FTVBUWSIpLAogICAgYnl0ZWMgOSAvLyAiRVJSOk5PRU1QVFkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEKICAgIC8vIGxvZyhtc2cpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmVtb3ZlX29wZXJhdG9yX2Zyb21fbGFiZWxfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxODgKICAgIC8vIGxhYmVsX2Rlc2NyaXB0b3IubnVtX29wZXJhdG9ycy5uYXRpdmUgLSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgZGVjciBvcGVyYXRvciBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fb3BlcmF0b3JzLm5hdGl2ZSAtIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTAKICAgIC8vIHNlbGYubGFiZWxzW2xhYmVsXSA9IGxhYmVsX2Rlc2NyaXB0b3IuY29weSgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTkyCiAgICAvLyBpZiBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0ubGVuZ3RoID09IDE6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTMKICAgIC8vIGRlbCBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0KICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToxOTUKICAgIC8vIG5leHRfbGlzdCA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MTk2LTE5OQogICAgLy8gIyB3YWxrLCBwdXNoIGV2ZXJ5dGhpbmcgZXhjZXB0IGluZGV4CiAgICAvLyAjIHRoaXMgaW1wbGVtZW50YXRpb24gd2Fsa3MgdHdpY2UgKG9uY2UgaW4gZ2V0X29wZXJhdG9yX2xhYmVsX2luZGV4KQogICAgLy8gIyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5vcGVyYXRvcnNbb3BlcmF0b3JdKToKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wZXJhdG9ycyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjE5Ni0xOTkKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIGV4Y2VwdCBpbmRleAogICAgLy8gIyB0aGlzIGltcGxlbWVudGF0aW9uIHdhbGtzIHR3aWNlIChvbmNlIGluIGdldF9vcGVyYXRvcl9sYWJlbF9pbmRleCkKICAgIC8vICMgY291bGQgYmUgbW9yZSBlZmZpY2llbnQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2ZvckAxNgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDAKICAgIC8vIGlmIGxhYmVsX2lkeCAhPSBpZHg6CiAgICBmcmFtZV9kaWcgNwogICAgIT0KICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDEKICAgIC8vIG5leHRfbGlzdC5hcHBlbmQoc3RvcmVkX2xhYmVsKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICBmcmFtZV9idXJ5IDMKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9mb3JfaGVhZGVyQDExCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9hZnRlcl9mb3JAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjAzCiAgICAvLyBzZWxmLm9wZXJhdG9yc1tvcGVyYXRvcl0gPSBuZXh0X2xpc3QuY29weSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMgogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZW1vdmVfb3BlcmF0b3JfZnJvbV9sYWJlbF9ib29sX21lcmdlQDgKCnJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlbW92ZV9vcGVyYXRvcl9mcm9tX2xhYmVsX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9vcGVyYXRvcl9sYWJlbHMob3BlcmF0b3I6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X29wZXJhdG9yX2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMDUtMjA2CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X29wZXJhdG9yX2xhYmVscyhzZWxmLCBvcGVyYXRvcjogQWNjb3VudCkgLT4gTGFiZWxMaXN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA3CiAgICAvLyBpZiBvcGVyYXRvciBpbiBzZWxmLm9wZXJhdG9yczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfb3BlcmF0b3JfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gcmV0dXJuIHNlbGYub3BlcmF0b3JzW29wZXJhdG9yXQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcGVyYXRvcnMgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCmdldF9vcGVyYXRvcl9sYWJlbHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjA5LTIxMAogICAgLy8gIyByZXR1cm4gZW1wdHkgbGlzdAogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuYWRkX2xhYmVsX3RvX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX2xhYmVsX3RvX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMS0yMjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF9sYWJlbF90b19hc3NldChzZWxmLCBsYWJlbDogU3RyaW5nLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzMgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gZW5zdXJlKGxhYmVsIGluIHNlbGYubGFiZWxzLCBTKCJFUlI6Tk9FWElTVCIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBibnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjMKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5vcGVyYXRvcl9vbmx5KGxhYmVsKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIG9wZXJhdG9yX29ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMjcKICAgIC8vIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhZGRfbGFiZWxfdG9fYXNzZXRfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTQKICAgIC8vIGlmIGFzc2V0IG5vdCBpbiBzZWxmLmFzc2V0czoKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9LRVkpCiAgICBpbnRjIDUgLy8gNDI5NDk2NzI5NgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBpZiBub3QgY29uZDoKICAgIGJueiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gUygiRVJSOkVYSVNUUyIpLAogICAgYnl0ZWMgNSAvLyAiRVJSOkVYSVNUUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MQogICAgLy8gbG9nKG1zZykKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzQtMjM1CiAgICAvLyAjIGFkZCBsYWJlbCB0byBvcGVyYXRvcgogICAgLy8gZXhpc3RpbmcgPSBzZWxmLmFzc2V0c1thc3NldF0uY29weSgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjM2CiAgICAvLyBleGlzdGluZy5hcHBlbmQoYXJjNC5TdHJpbmcobGFiZWwpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gZXhpc3RpbmcuY29weSgpCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0Mi0yNDMKICAgIC8vICMgaW5jciBhc3NldCBjb3VudAogICAgLy8gbGFiZWxfZGVzY3JpcHRvciA9IHNlbGYubGFiZWxzW2xhYmVsXS5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFiZWxzIGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ0LTI0NgogICAgLy8gbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgbGFiZWxfZGVzY3JpcHRvci5udW1fYXNzZXRzLm5hdGl2ZSArIFVJbnQ2NCgxKQogICAgLy8gKQogICAgaXRvYgogICAgcmVwbGFjZTIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gc2VsZi5sYWJlbHNbbGFiZWxdID0gbGFiZWxfZGVzY3JpcHRvci5jb3B5KCkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMTYKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMAogICAgZnJhbWVfYnVyeSAzCgphZGRfbGFiZWxfdG9fYXNzZXRfZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2ZvckAxMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gaWYgc3RvcmVkX2xhYmVsID09IGxhYmVsOgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IGFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5nZXRfYXNzZXRfbGFiZWxfaW5kZXgoYXNzZXQsIGxhYmVsKSA9PSBVSW50NjQoTk9UX0ZPVU5EX1ZBTFVFKSwKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVsX2luZGV4QDEyCgphZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGFkZF9sYWJlbF90b19hc3NldF9mb3JfaGVhZGVyQDcKCmFkZF9sYWJlbF90b19hc3NldF9hZnRlcl9mb3JAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjE5CiAgICAvLyByZXR1cm4gVUludDY0KE5PVF9GT1VORF9WQUxVRSkKICAgIGludGMgNCAvLyA0Mjk0OTY3Mjk1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmdldF9hc3NldF9sYWJlbF9pbmRleChhc3NldCwgbGFiZWwpID09IFVJbnQ2NChOT1RfRk9VTkRfVkFMVUUpLAogICAgYiBhZGRfbGFiZWxfdG9fYXNzZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfbGFiZWxfaW5kZXhAMTIKCmFkZF9sYWJlbF90b19hc3NldF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyMzktMjQwCiAgICAvLyAjIG5ldyBvcGVyYXRvciwgY3JlYXRlIG5ldyBib3gKICAgIC8vIHNlbGYuYXNzZXRzW2Fzc2V0XSA9IGFyYzQuRHluYW1pY0FycmF5KGFyYzQuU3RyaW5nKGxhYmVsKSkKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgYWRkX2xhYmVsX3RvX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0KGxhYmVsOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjQ5LTI1MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBkZWYgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXQoc2VsZiwgbGFiZWw6IFN0cmluZywgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18zIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDAKICAgIC8vIGlmIG5vdCBjb25kOgogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTEKICAgIC8vIGVuc3VyZShsYWJlbCBpbiBzZWxmLmxhYmVscywgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyBzZWxmLm9wZXJhdG9yX29ubHkobGFiZWwpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgb3BlcmF0b3Jfb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gaWYgc2VsZi5hc3NldHNbYXNzZXRdLmxlbmd0aCA9PSAxOgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmFzc2V0c1thc3NldF1bMF0gPT0gbGFiZWw6CiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTgKICAgIC8vIGRlbCBzZWxmLmFzc2V0c1thc3NldF0KICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNTkKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgNQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MAogICAgLy8gaWYgbm90IGNvbmQ6CiAgICBmcmFtZV9kaWcgNQogICAgYm56IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzQKICAgIC8vIGVuc3VyZShmb3VuZCwgUygiRVJSOk5PRVhJU1QiKSkKICAgIGJ5dGVjXzEgLy8gIkVSUjpOT0VYSVNUIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBsb2cobXNnKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc2LTI3NwogICAgLy8gIyBkZWNyIGFzc2V0IGNvdW50CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yID0gc2VsZi5sYWJlbHNbbGFiZWxdLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sYWJlbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjc5CiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNzgtMjgwCiAgICAvLyBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBsYWJlbF9kZXNjcmlwdG9yLm51bV9hc3NldHMubmF0aXZlIC0gVUludDY0KDEpCiAgICAvLyApCiAgICBpdG9iCiAgICByZXBsYWNlMiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLmxhYmVsc1tsYWJlbF0gPSBsYWJlbF9kZXNjcmlwdG9yLmNvcHkoKQogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgpyZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjEKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMwoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjYzCiAgICAvLyBuZXh0X2xpc3QgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vICMgd2FsaywgcHVzaCBldmVyeXRoaW5nIHRvIG5ldyBib3ggZXhjZXB0IGxhYmVsCiAgICAvLyAjIHNhdmUgJGZvdW5kIHRvIHRocm93IGlmIG5vdCBmb3VuZAogICAgLy8gZm9yIGlkeCwgc3RvcmVkX2xhYmVsIGluIHVlbnVtZXJhdGUoc2VsZi5hc3NldHNbYXNzZXRdKToKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCnJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyAjIHdhbGssIHB1c2ggZXZlcnl0aGluZyB0byBuZXcgYm94IGV4Y2VwdCBsYWJlbAogICAgLy8gIyBzYXZlICRmb3VuZCB0byB0aHJvdyBpZiBub3QgZm91bmQKICAgIC8vIGZvciBpZHgsIHN0b3JlZF9sYWJlbCBpbiB1ZW51bWVyYXRlKHNlbGYuYXNzZXRzW2Fzc2V0XSk6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2FmdGVyX2ZvckAxMgogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyNjcKICAgIC8vIGlmIHN0b3JlZF9sYWJlbCAhPSBsYWJlbDoKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gbmV4dF9saXN0LmFwcGVuZChzdG9yZWRfbGFiZWwpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIGZyYW1lX2J1cnkgMQoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIHJlbW92ZV9sYWJlbF9mcm9tX2Fzc2V0X2Zvcl9oZWFkZXJANgoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MjcwCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfaWZfZWxzZUAxMAoKcmVtb3ZlX2xhYmVsX2Zyb21fYXNzZXRfYWZ0ZXJfZm9yQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc2VsZi5hc3NldHNbYXNzZXRdID0gbmV4dF9saXN0LmNvcHkoKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgMQogICAgYm94X3B1dAogICAgYiByZW1vdmVfbGFiZWxfZnJvbV9hc3NldF9hZnRlcl9pZl9lbHNlQDEzCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X2xhYmVscyhhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X2xhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODMtMjg0CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2xhYmVscyhzZWxmLCBhc3NldDogQXNzZXQpIC0+IExhYmVsTGlzdDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gaWYgYXNzZXQgaW4gc2VsZi5hc3NldHM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRfYXNzZXRfbGFiZWxzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRzW2Fzc2V0XQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJldHN1YgoKZ2V0X2Fzc2V0X2xhYmVsc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyODctMjg4CiAgICAvLyAjIHJldHVybiBlbXB0eQogICAgLy8gcmV0dXJuIGVtcHR5X2xpc3QoKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c19sYWJlbHMoYXNzZXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hc3NldHNfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5MC0yOTMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2xhYmVscygKICAgIC8vICAgICBzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XQogICAgLy8gKSAtPiBhcmM0LkR5bmFtaWNBcnJheVtMYWJlbExpc3RdOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gb3V0ID0gYXJjNC5EeW5hbWljQXJyYXlbTGFiZWxMaXN0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weToyOTUKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX2xhYmVsc19hZnRlcl9mb3JANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhc3NldCA9IEFzc2V0KGFzc2V0X2lkLm5hdGl2ZSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk3CiAgICAvLyBpZiBhc3NldCBpbiBzZWxmLmFzc2V0czoKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9hc3NldHNfbGFiZWxzX2Vsc2VfYm9keUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mjk4CiAgICAvLyBvdXQuYXBwZW5kKHNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X2Fzc2V0c19sYWJlbHNfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX2xhYmVsc19lbHNlX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMDAKICAgIC8vIG91dC5hcHBlbmQoZW1wdHlfbGlzdCgpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDAwMDIwMDAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbGFiZWxzX2FmdGVyX2lmX2Vsc2VANQoKZ2V0X2Fzc2V0c19sYWJlbHNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzAxCiAgICAvLyByZXR1cm4gb3V0CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X21pY3JvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF9hc3NldF9taWNybyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE0CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzEyLTMxNQogICAgLy8gcmV0dXJuIEFzc2V0TWljcm8oCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgZGVjaW1hbHM9YXJjNC5VSW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X21pY3JvKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWljcm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE3LTMxOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNybyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldE1pY3JvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzE5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfbWljcm8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm8oYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19taWNybzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMjEtMzIyCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c19taWNybyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI0CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X21pY3JvKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19taWNyb19mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfbWljcm9fYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhhc3NldF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzI4LTMyOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscyhzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldE1pY3JvTGFiZWxzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMyCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzMzCiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM0CiAgICAvLyBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0cyBlbnRyeSBleGlzdHMKCl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozMzEtMzM1CiAgICAvLyByZXR1cm4gQXNzZXRNaWNyb0xhYmVscygKICAgIC8vICAgICB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIC8vICAgICBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA1IC8vIDUKICAgICsKICAgIHB1c2hieXRlcyAweDAwMDUKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2dldF9hc3NldF9taWNyb19sYWJlbHNfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfbWljcm9fbGFiZWxzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldF9hc3NldF9taWNyb19sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzM3LTMzOAogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9taWNyb19sYWJlbHMoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRNaWNyb0xhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9taWNyb19sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9taWNyb19sYWJlbHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldHNfbWljcm9fbGFiZWxzKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfbWljcm9fbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MS0zNDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX21pY3JvX2xhYmVscyhzZWxmLCBhc3NldHM6IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDAKCmdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX21pY3JvX2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfbWljcm9fbGFiZWxzKGFzc2V0X2lkLm5hdGl2ZSkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X21pY3JvX2xhYmVscwogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfbWljcm9fbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19taWNyb19sYWJlbHNfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfYXNzZXRfdGV4dChzZWxmLCBhc3NldF9pZDogVUludDY0KSAtPiBBc3NldFRleHQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTIKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzUzCiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU0CiAgICAvLyB1cmw9YjJzdHIoYXNzZXQudXJsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF90ZXh0X3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNTEtMzU2CiAgICAvLyByZXR1cm4gQXNzZXRUZXh0KAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3RleHRfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfdGV4dF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRfdGV4dChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3RleHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzU4LTM1OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0KHNlbGYsIGFzc2V0OiBVSW50NjQpIC0+IEFzc2V0VGV4dDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF90ZXh0KGFzc2V0KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0KGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfdGV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjItMzYzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0c190ZXh0KHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNjQKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3RleHRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY1CiAgICAvLyBsb2coc2VsZi5fZ2V0X2Fzc2V0X3RleHQoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfdGV4dF9mb3JfaGVhZGVyQDEKCmdldF9hc3NldHNfdGV4dF9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0VGV4dExhYmVsczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gbmFtZT1iMnN0cihhc3NldC5uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzQKICAgIC8vIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgYjJzdHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozNzUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6MzcyLTM3NgogICAgLy8gcmV0dXJuIEFzc2V0VGV4dExhYmVscygKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgLy8gKQogICAgZGlnIDIKICAgIGxlbgogICAgcHVzaGludCA2IC8vIDYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0X3RleHRfbGFiZWxzKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfdGV4dF9sYWJlbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzc4LTM3OQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF90ZXh0X2xhYmVscyhzZWxmLCBhc3NldDogVUludDY0KSAtPiBBc3NldFRleHRMYWJlbHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF90ZXh0X2xhYmVscwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuZ2V0X2Fzc2V0c190ZXh0X2xhYmVscyhhc3NldHM6IGJ5dGVzKSAtPiB2b2lkOgpnZXRfYXNzZXRzX3RleHRfbGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzKHNlbGYsIGFzc2V0czogYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMAoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg0CiAgICAvLyBmb3IgX2ksIGFzc2V0X2lkIGluIHVlbnVtZXJhdGUoYXNzZXRzKToKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozODUKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfdGV4dF9sYWJlbHMoYXNzZXRfaWQubmF0aXZlKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9nZXRfYXNzZXRfdGV4dF9sYWJlbHMKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBnZXRfYXNzZXRzX3RleHRfbGFiZWxzX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c190ZXh0X2xhYmVsc19hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLl9nZXRfYXNzZXRfc21hbGwoYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfYXNzZXRfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzg5LTM5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X3NtYWxsKHNlbGYsIGFzc2V0X2lkOiBVSW50NjQpIC0+IEFzc2V0U21hbGw6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTMKICAgIC8vIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk1CiAgICAvLyBkZWNpbWFscz1hcmM0LlVJbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk2CiAgICAvLyB0b3RhbD1hcmM0LlVJbnQ2NChhc3NldC50b3RhbCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gaGFzX2ZyZWV6ZT1hcmM0LkJvb2woYXNzZXQuZnJlZXplICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6Mzk4CiAgICAvLyBoYXNfY2xhd2JhY2s9YXJjNC5Cb29sKGFzc2V0LmNsYXdiYWNrICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTkKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2dldF9hc3NldF9zbWFsbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldHMgZW50cnkgZXhpc3RzCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTozOTItNDAwCiAgICAvLyByZXR1cm4gQXNzZXRTbWFsbCgKICAgIC8vICAgICBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgLy8gICAgIHVuaXRfbmFtZT1iMnN0cihhc3NldC51bml0X25hbWUpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIC8vICAgICBoYXNfZnJlZXplPWFyYzQuQm9vbChhc3NldC5mcmVlemUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcyksCiAgICAvLyAgICAgaGFzX2NsYXdiYWNrPWFyYzQuQm9vbChhc3NldC5jbGF3YmFjayAhPSBHbG9iYWwuemVyb19hZGRyZXNzKSwKICAgIC8vICAgICBsYWJlbHM9c2VsZi5hc3NldHNbYXNzZXRdLmNvcHkoKSBpZiBhc3NldCBpbiBzZWxmLmFzc2V0cyBlbHNlIGVtcHR5X2xpc3QoKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAxMAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgMTA1IC8vIDEwNQogICAgc3dhcAogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYiBfZ2V0X2Fzc2V0X3NtYWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9zbWFsbChhc3NldDogdWludDY0KSAtPiBieXRlczoKZ2V0X2Fzc2V0X3NtYWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwMi00MDMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfc21hbGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRTbWFsbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfZ2V0X2Fzc2V0X3NtYWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX3NtYWxsKGFzc2V0czogYnl0ZXMpIC0+IHZvaWQ6CmdldF9hc3NldHNfc21hbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDA2LTQwNwogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldHNfc21hbGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX3NtYWxsX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MDgKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gbG9nKHNlbGYuX2dldF9hc3NldF9zbWFsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9zbWFsbAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGdldF9hc3NldHNfc21hbGxfZm9yX2hlYWRlckAxCgpnZXRfYXNzZXRzX3NtYWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzc2V0X2xhYmVsaW5nLmNvbnRyYWN0LkFzc2V0TGFiZWxpbmcuX2dldF9hc3NldF9mdWxsKGFzc2V0X2lkOiB1aW50NjQpIC0+IGJ5dGVzOgpfZ2V0X2Fzc2V0X2Z1bGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDEzLTQxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXRfaWQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gcmVzZXJ2ZV9hY2N0ID0gQWNjb3VudChhc3NldC5yZXNlcnZlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MTgtNDIwCiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIC8vIGlmIHJlc2VydmVfYWNjdC5pc19vcHRlZF9pbihhc3NldCkKICAgIC8vIGVsc2UgVUludDY0KDApCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDE4CiAgICAvLyBhc3NldC5iYWxhbmNlKHJlc2VydmVfYWNjdCkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIzCiAgICAvLyBuYW1lPWIyc3RyKGFzc2V0Lm5hbWUpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY2FsbHN1YiBiMnN0cgogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDI0CiAgICAvLyB1bml0X25hbWU9YjJzdHIoYXNzZXQudW5pdF9uYW1lKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjUKICAgIC8vIHVybD1iMnN0cihhc3NldC51cmwpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjYWxsc3ViIGIyc3RyCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjYKICAgIC8vIHRvdGFsPWFyYzQuVUludDY0KGFzc2V0LnRvdGFsKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjcKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gbWFuYWdlcj1hcmM0LkFkZHJlc3MoYXNzZXQubWFuYWdlciksCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjkKICAgIC8vIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gY2xhd2JhY2s9YXJjNC5BZGRyZXNzKGFzc2V0LmNsYXdiYWNrKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDExCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDMxCiAgICAvLyByZXNlcnZlPWFyYzQuQWRkcmVzcyhhc3NldC5yZXNlcnZlKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgOAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gbWV0YWRhdGFfaGFzaD1hcmM0LkR5bmFtaWNCeXRlcyhhc3NldC5tZXRhZGF0YV9oYXNoKSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gcmVzZXJ2ZV9iYWxhbmNlPWFyYzQuVUludDY0KHJlc2VydmVfYmFsYW5jZSksCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzQKICAgIC8vIGxhYmVscz1zZWxmLmFzc2V0c1thc3NldF0uY29weSgpIGlmIGFzc2V0IGluIHNlbGYuYXNzZXRzIGVsc2UgZW1wdHlfbGlzdCgpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1CiAgICBmcmFtZV9kaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRzIGVudHJ5IGV4aXN0cwoKX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MjItNDM1CiAgICAvLyByZXR1cm4gQXNzZXRGdWxsKAogICAgLy8gICAgIG5hbWU9YjJzdHIoYXNzZXQubmFtZSksCiAgICAvLyAgICAgdW5pdF9uYW1lPWIyc3RyKGFzc2V0LnVuaXRfbmFtZSksCiAgICAvLyAgICAgdXJsPWIyc3RyKGFzc2V0LnVybCksCiAgICAvLyAgICAgdG90YWw9YXJjNC5VSW50NjQoYXNzZXQudG90YWwpLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICAgIG1hbmFnZXI9YXJjNC5BZGRyZXNzKGFzc2V0Lm1hbmFnZXIpLAogICAgLy8gICAgIGZyZWV6ZT1hcmM0LkFkZHJlc3MoYXNzZXQuZnJlZXplKSwKICAgIC8vICAgICBjbGF3YmFjaz1hcmM0LkFkZHJlc3MoYXNzZXQuY2xhd2JhY2spLAogICAgLy8gICAgIHJlc2VydmU9YXJjNC5BZGRyZXNzKGFzc2V0LnJlc2VydmUpLAogICAgLy8gICAgIHJlc2VydmVfYmFsYW5jZT1hcmM0LlVJbnQ2NChyZXNlcnZlX2JhbGFuY2UpLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9YXJjNC5EeW5hbWljQnl0ZXMoYXNzZXQubWV0YWRhdGFfaGFzaCksCiAgICAvLyAgICAgbGFiZWxzPXNlbGYuYXNzZXRzW2Fzc2V0XS5jb3B5KCkgaWYgYXNzZXQgaW4gc2VsZi5hc3NldHMgZWxzZSBlbXB0eV9saXN0KCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTU1IC8vIDE1NQogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDA5YgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X2Fzc2V0X2Z1bGxfdGVybmFyeV9mYWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5TdHJpbmddKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBiIF9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X21lcmdlQDYKCl9nZXRfYXNzZXRfZnVsbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDIwCiAgICAvLyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGIgX2dldF9hc3NldF9mdWxsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc3NldF9sYWJlbGluZy5jb250cmFjdC5Bc3NldExhYmVsaW5nLmdldF9hc3NldF9mdWxsKGFzc2V0OiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfZnVsbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0MzctNDM4CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2Z1bGwoc2VsZiwgYXNzZXQ6IFVJbnQ2NCkgLT4gQXNzZXRGdWxsOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNzZXRfbGFiZWxpbmcvY29udHJhY3QucHk6NDM5CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X2Fzc2V0X2Z1bGwoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNzZXRfbGFiZWxpbmcuY29udHJhY3QuQXNzZXRMYWJlbGluZy5nZXRfYXNzZXRzX2Z1bGwoYXNzZXRzOiBieXRlcykgLT4gdm9pZDoKZ2V0X2Fzc2V0c19mdWxsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MS00NDIKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRzX2Z1bGwoc2VsZiwgYXNzZXRzOiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDMKICAgIC8vIGZvciBfaSwgYXNzZXRfaWQgaW4gdWVudW1lcmF0ZShhc3NldHMpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAwCgpnZXRfYXNzZXRzX2Z1bGxfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fzc2V0X2xhYmVsaW5nL2NvbnRyYWN0LnB5OjQ0MwogICAgLy8gZm9yIF9pLCBhc3NldF9pZCBpbiB1ZW51bWVyYXRlKGFzc2V0cyk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGdldF9hc3NldHNfZnVsbF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc3NldF9sYWJlbGluZy9jb250cmFjdC5weTo0NDQKICAgIC8vIGxvZyhzZWxmLl9nZXRfYXNzZXRfZnVsbChhc3NldF9pZC5uYXRpdmUpKQogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2dldF9hc3NldF9mdWxsCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgZ2V0X2Fzc2V0c19mdWxsX2Zvcl9oZWFkZXJAMQoKZ2V0X2Fzc2V0c19mdWxsX2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCg==","clear":"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"},"byteCode":{"approval":"CiAGAQACCP////8PgICAgBAmCwQVH3x1C0VSUjpOT0VYSVNUAgAAAAVhZG1pbgpFUlI6RVhJU1RTAgACCkVSUjpVTkFVVEgIAAAAAAAAAAALRVJSOk5PRU1QVFkCAAExGEAABScEMQBnMRtBAoOCGASPDX2OBHwbMvYEF+aRrgQz0P/cBHJWFucE+sHPGwS0xQufBKLdIkcEo33qEQRo8Y76BMLtdD8Epn8DwgSq7gxhBLbDn2gEY1vjYgRwk7ENBOG7lfwEVUC4CgSKQS+TBG8XzdUEekzkuQQ2bFGvBNXTutMEA7qY2zYaAI4YAcIBqgGYAYIBcwFbAUMBLQEVAP0A5wDUAMAAsQCdAI4AegBrAFcASAA0ACUAEQACI0MxGRREMRhENhoBiAupIkMxGRREMRhENhoBF4gLkChMULAiQzEZFEQxGEQ2GgGICkoiQzEZFEQxGEQ2GgEXiAoxKExQsCJDMRkURDEYRDYaAYgJYSJDMRkURDEYRDYaAReICUgoTFCwIkMxGRREMRhENhoBiAjMIkMxGRREMRhENhoBF4gIsyhMULAiQzEZFEQxGEQ2GgGICAwiQzEZFEQxGEQ2GgEXiAfzKExQsCJDMRkURDEYRDYaAYgHcSJDMRkURDEYRDYaAReIB1goTFCwIkMxGRREMRhENhoBiAa+KExQsCJDMRkURDEYRDYaARfAMIgGkihMULAiQzEZFEQxGEQ2GgFXAgA2GgIXwDCIBaYiQzEZFEQxGEQ2GgFXAgA2GgIXwDCIBMciQzEZFEQxGEQ2GgEXwByIBKMoTFCwIkMxGRREMRhENhoBF8AcNhoCVwIAiAONIkMxGRREMRhENhoBF8AcNhoCVwIAiAL8IkMxGRREMRhENhoBiAIlIkMxGRREMRhENhoBVwIAiAIAKExQsCJDMRkURDEYRDYaAVcCAIgBwyJDMRkURDEYRDYaAVcCADYaAlcCAIgBWiJDMRkURDEYRDYaARfAHIgBPCJDMRmNBgAT/hz+HP4cAAsAA0L+GTEYRIgBDSJDMRhEiAEBIkMxGBREIkOKAwGL/SNZSYv/CEwkCyQISwEWVwYCTgKL/SRLAlKL/yQLr1CL/RWL/U8DTwJSUIv+UEwkC0kjTIsDiwIMQQAjiwRJFlcGAosBiwNJTgRPAl1JjAFLAVkkCAiMBCQIjANC/9WLAIsBUIwAiYoEAStJi/4kC4v8JAsjiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAjjASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBi/8VFlcGAov/UImIAAWJiAABiTEAIycEZUQSQAAEJwewAImKAQCI/+onBIv/Z4mKAgCI/96L/r1FAUEABCcFsACL/hUkEkAADoAKRVJSOkxFTkdUSLAAi/8VFlcGAov/UIASABIAAAAAAAAAAAAAAAAAAAAATFCL/rxIi/5Mv4mKAQCI/42L/71FAUAAAymwAIv/vkRXAggnCKhAAAQnCbAAi/+8SImKAQGL/71FAUAAAymwAIv/vkSJigEAi/8jWSOLAYsADEEAIov/VwIAiwFJTgIkC0sBTFlKWSQIWFcCAL5EsCIIjAFC/9aJigEAMQAjJwRlRBJBAAGJi/+IAAGJigEAMQCL/4gAHEkhBRNBABGLACEEE0EACSJAAAQnB7AAiSNC//SKAgEjK0mL/r1FAUAABSEFjACJi/6+TElOAowARCNZjAEjjAKLAosBDEEAKYsAVwIAiwIkC0sBTFlKWSQIWFcCAIv/EkEABYsCjACJiwIiCIwCQv/PIQSMAImKAgCL/4j/Y4v/vUUBQAADKbAAi/69RQFBAEGL/ov/iP+EIQQSQAAEJwWwAIv+vkSL/xUWVwYCi/9QIoj9Uov+vEiL/ky/i/++REmBClsiCBZcCov/vEiL/0y/iYv/FRZXBgKL/1AnBkxQJwpMUIv+vEiL/ky/Qv/NigIAI0cEK0cCi/+I/uSL/71FAUAAAymwAIv+vUUBQAADKbAAi/6L/4j/AkmMByEEE0EAwosHIQUTQQC6IkAAAymwAIv/vkxJTgKMAERXCgiACAAAAAAAAAABpUAAC4sAVwIIJwioQQCJIkAABCcJsACLAEmBClsiCRZcCov/vEiL/0y/i/6+RCNZIhJBAAWL/rxIiSqMAov+vkxJTgKMAUQjWYwFI4wGiwaLBQxBADiLAVcCAIsGSU4CJAtLAUxZSlkkCFiMBIsHE4sCjANBAAqLAosEIoj8PowDiwOMAosGIgiMBkL/wIv+vEiL/osCv4kjQv90I0L/Q4oBAYv/vUUBQQAFi/++RIkqiYoCACNJK0mL/r1FAUAAAymwAIv+iP3ki/8WSYwBvUUBQQCIiwG9RQFAADkhBSEEEkAABCcFsACLAUm+RIv+FRZXBgKL/lAiiPvBSwG8SL+L/r5ESSRbIggWXAKL/rxIi/5Mv4mLAb5MSU4CjABEI1mMAiOMA4sDiwIMQQApiwBXAgCLAyQLSwFMWUpZJAhYVwIAi/4SQQAFiwNC/5CLAyIIjANC/88hBEL/gov+FRZXBgKL/lAnBkxQJwpMUIsBSbxITL9C/4iKAgAjRwMrRwKL/r1FAUAAAymwAIv+iP0bI4wFi/8WSYwDvkQjWSISQQBHiwO+RElXAgBMI1lESSNZSlkkCFhXAgCL/hJBACSLA7xIIowFiwVAAAMpsACL/r5ESSRbIgkWXAKL/rxIi/5Mv4kjjAVC/90qjAGLA75MSU4CjABEI1mMBCOMBosGiwQMQQA3iwBXAgCLBiQLSwFMWUpZJAhYSYwCVwIAi/4TQQATiwGLAiKI+pCMAYsGIgiMBkL/xyKMBUL/8YsDSbxIiwG/Qv9/igEBi/8WSb1FAUEABosAvkRMiSpMiYoBASMqi/8jWSOLA4sCDEEATov/VwIAiwMlC1sWSYwAvUUBQQAiiwC+RCcGTFCLAUkjWUxXAgAiTwOI+oyMAYsDIgiMA0L/wosBSSNZTFcCACKABAACAACI+m6MAUL/34sBjACJigEBi/9xA0SI+tmL/3EBRBZJkyUORFcHAYACAANMUExQiYoBAYv/iP/WiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP+1sCIIjAFC/+CJigEBi/9xA0SI+oWL/3EBRBZJkyUORFcHAYv/Fkm9RQFBAB+LAr5EiwBJFYEFCIACAAWLAVBMFlcGAlBMUExQjACJKkL/4YoBAYv/iP+yiYoBAIv/I1kjiwGLAAxBABiL/1cCAIsBSU4CJQtbiP+RsCIIjAFC/+CJigEBi/9xBESI+g2L/3EDRIj6BYv/cQVEiPn9i/8WSb1FAUEAQosDvkSLAEkVJQhJFlcGAoACAAhMUIsBSU4DFU8CCEkWVwYCTwJMUIsCSU4DFU8CCBZXBgJQTwNQTwJQTFBMUIwAiSpC/76KAQGL/4j/jYmKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j/bLAiCIwBQv/giYoBAYv/cQREiPlwi/9xA0SI+WiL/3EFRIj5YEsCFYEGCEkWVwYCgAIABkxQSwMVTwIIFlcGAlBPA1BPAlBMUImKAQGL/4j/uImKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j/l7AiCIwBQv/giYoBAYv/cQREiPj+i/9xA0SI+PaL/3EBRBZJkyUORFcHAYv/cQBEFov/cQlEMgMTgAEAI08CVIv/cQpEMgMTgAEAI08CVIv/Fkm9RQFBAEGLBr5EiwBJFYEQCEkWVwYCgAIAEExQiwFJTgMVTwIITIsCUIsDUIsEUIsFI1OBaUxUTBZXBgJQTwJQTFBMUIwAiSpC/7+KAQGL/4j/ZImKAQCL/yNZI4sBiwAMQQAYi/9XAgCLAUlOAiULW4j/Q7AiCIwBQv/giYoBASNHC4v/cQhMSU8CRIv/cABFAUEA7osMi/9wAESL/3EERIj4HIwBi/9xA0SI+BKMAov/cQVEiPgIjAOL/3EARBaMBov/cQFEFkmTJQ5EVwcBjAWL/3EHTIwJRIv/cQlMjApEi/9xCkyMC0SL/3EITIwIRIv/cQZESRUWVwYCTFCMABaMB4v/FkmMBL1FAUEAb4sEvkSLAUkVgZsBCEkWVwYCgAIAm0xQiwJJTgMVTwIISRZXBgJPAkxQiwNJTgMVTwIITIsGUIsFUIsJUIsKUIsLUIsIUEsBFlcGAlCLAElOAxVPAghMiwdQTBZXBgJQTwRQTwNQTwJQTFBMUIwAiSpC/5EjQv8VigEBi/+I/u6JigEAi/8jWSOLAYsADEEAGIv/VwIAiwFJTgIlC1uI/s2wIgiMAUL/4Ik=","clear":"CoEBQw=="},"compilerInfo":{"compiler":"puya","compilerVersion":{"major":4,"minor":6,"patch":1}},"events":[],"templateVariables":{}} as unknown as Arc56Contract /** * A state record containing binary data @@ -136,18 +136,32 @@ export function AssetSmallFromTuple(abiTuple: [string, string, number, bigint, b export type AssetText = { name: string, unitName: string, - labels: string[], - url: string + url: string, + labels: string[] } /** * Converts the ABI tuple representation of a AssetText to the struct representation */ -export function AssetTextFromTuple(abiTuple: [string, string, string[], string]) { +export function AssetTextFromTuple(abiTuple: [string, string, string, string[]]) { return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetText, APP_SPEC.structs) as AssetText } +export type AssetTextLabels = { + name: string, + unitName: string, + url: string +} + + +/** + * Converts the ABI tuple representation of a AssetTextLabels to the struct representation + */ +export function AssetTextLabelsFromTuple(abiTuple: [string, string, string]) { + return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetTextLabels, APP_SPEC.structs) as AssetTextLabels +} + export type LabelDescriptor = { name: string, numAssets: bigint, @@ -223,12 +237,18 @@ export type AssetLabelingArgs = { 'get_assets_micro_labels(uint64[])void': { assets: bigint[] | number[] } - 'get_asset_text(uint64)(string,string,string[],string)': { + 'get_asset_text(uint64)(string,string,string,string[])': { asset: bigint | number } 'get_assets_text(uint64[])void': { assets: bigint[] | number[] } + 'get_asset_text_labels(uint64)(string,string,string)': { + asset: bigint | number + } + 'get_assets_text_labels(uint64[])void': { + assets: bigint[] | number[] + } 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': { asset: bigint | number } @@ -262,8 +282,10 @@ export type AssetLabelingArgs = { 'get_assets_micro(uint64[])void': [assets: bigint[] | number[]] 'get_asset_micro_labels(uint64)(string,uint8,string[])': [asset: bigint | number] 'get_assets_micro_labels(uint64[])void': [assets: bigint[] | number[]] - 'get_asset_text(uint64)(string,string,string[],string)': [asset: bigint | number] + 'get_asset_text(uint64)(string,string,string,string[])': [asset: bigint | number] 'get_assets_text(uint64[])void': [assets: bigint[] | number[]] + 'get_asset_text_labels(uint64)(string,string,string)': [asset: bigint | number] + 'get_assets_text_labels(uint64[])void': [assets: bigint[] | number[]] 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': [asset: bigint | number] 'get_assets_small(uint64[])void': [assets: bigint[] | number[]] 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': [asset: bigint | number] @@ -291,8 +313,10 @@ export type AssetLabelingReturns = { 'get_assets_micro(uint64[])void': void 'get_asset_micro_labels(uint64)(string,uint8,string[])': AssetMicroLabels 'get_assets_micro_labels(uint64[])void': void - 'get_asset_text(uint64)(string,string,string[],string)': AssetText + 'get_asset_text(uint64)(string,string,string,string[])': AssetText 'get_assets_text(uint64[])void': void + 'get_asset_text_labels(uint64)(string,string,string)': AssetTextLabels + 'get_assets_text_labels(uint64[])void': void 'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])': AssetSmall 'get_assets_small(uint64[])void': void 'get_asset_full(uint64)(string,string,string,uint64,uint8,address,address,address,address,byte[],uint64,string[])': AssetFull @@ -387,16 +411,26 @@ export type AssetLabelingTypes = { argsTuple: AssetLabelingArgs['tuple']['get_assets_micro_labels(uint64[])void'] returns: AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] }> - & Record<'get_asset_text(uint64)(string,string,string[],string)' | 'get_asset_text', { - argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string[],string)'] - argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string[],string)'] - returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] + & Record<'get_asset_text(uint64)(string,string,string,string[])' | 'get_asset_text', { + argsObj: AssetLabelingArgs['obj']['get_asset_text(uint64)(string,string,string,string[])'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_text(uint64)(string,string,string,string[])'] + returns: AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] }> & Record<'get_assets_text(uint64[])void' | 'get_assets_text', { argsObj: AssetLabelingArgs['obj']['get_assets_text(uint64[])void'] argsTuple: AssetLabelingArgs['tuple']['get_assets_text(uint64[])void'] returns: AssetLabelingReturns['get_assets_text(uint64[])void'] }> + & Record<'get_asset_text_labels(uint64)(string,string,string)' | 'get_asset_text_labels', { + argsObj: AssetLabelingArgs['obj']['get_asset_text_labels(uint64)(string,string,string)'] + argsTuple: AssetLabelingArgs['tuple']['get_asset_text_labels(uint64)(string,string,string)'] + returns: AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'] + }> + & Record<'get_assets_text_labels(uint64[])void' | 'get_assets_text_labels', { + argsObj: AssetLabelingArgs['obj']['get_assets_text_labels(uint64[])void'] + argsTuple: AssetLabelingArgs['tuple']['get_assets_text_labels(uint64[])void'] + returns: AssetLabelingReturns['get_assets_text_labels(uint64[])void'] + }> & Record<'get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])' | 'get_asset_small', { argsObj: AssetLabelingArgs['obj']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] argsTuple: AssetLabelingArgs['tuple']['get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])'] @@ -481,6 +515,16 @@ export type BoxKeysState = AssetLabelingTypes['state']['box']['keys'] */ export type AssetLabelingCreateCallParams = | Expand +/** + * Defines supported update method params for this smart contract + */ +export type AssetLabelingUpdateCallParams = + | Expand & {method?: never} +/** + * Defines supported delete method params for this smart contract + */ +export type AssetLabelingDeleteCallParams = + | Expand & {method?: never} /** * Defines arguments required for the deploy method. */ @@ -489,6 +533,14 @@ export type AssetLabelingDeployParams = Expand @@ -705,15 +757,15 @@ export abstract class AssetLabelingParamsFactory { } } /** - * Constructs a no op call for the get_asset_text(uint64)(string,string,string[],string) ABI method + * Constructs a no op call for the get_asset_text(uint64)(string,string,string,string[]) ABI method * * @param params Parameters for the call * @returns An `AppClientMethodCallParams` object for the call */ - static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + static getAssetText(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { return { ...params, - method: 'get_asset_text(uint64)(string,string,string[],string)' as const, + method: 'get_asset_text(uint64)(string,string,string,string[])' as const, args: Array.isArray(params.args) ? params.args : [params.args.asset], } } @@ -730,6 +782,32 @@ export abstract class AssetLabelingParamsFactory { args: Array.isArray(params.args) ? params.args : [params.args.assets], } } + /** + * Constructs a no op call for the get_asset_text_labels(uint64)(string,string,string) ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetTextLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_asset_text_labels(uint64)(string,string,string)' as const, + args: Array.isArray(params.args) ? params.args : [params.args.asset], + } + } + /** + * Constructs a no op call for the get_assets_text_labels(uint64[])void ABI method + * + * @param params Parameters for the call + * @returns An `AppClientMethodCallParams` object for the call + */ + static getAssetsTextLabels(params: CallParams & CallOnComplete): AppClientMethodCallParams & CallOnComplete { + return { + ...params, + method: 'get_assets_text_labels(uint64[])void' as const, + args: Array.isArray(params.args) ? params.args : [params.args.assets], + } + } /** * Constructs a no op call for the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method * @@ -879,6 +957,36 @@ export class AssetLabelingFactory { }, }, + /** + * Gets available deployUpdate methods + */ + deployUpdate: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a deployUpdate call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.deployUpdate(params) + }, + }, + + /** + * Gets available deployDelete methods + */ + deployDelete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The params for a deployDelete call + */ + bare: (params?: Expand) => { + return this.appFactory.params.bare.deployDelete(params) + }, + }, + } /** @@ -1012,6 +1120,36 @@ export class AssetLabelingClient { * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation. */ readonly params = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The update result + */ + bare: (params?: Expand) => { + return this.appClient.params.bare.update(params) + }, + }, + + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The delete result + */ + bare: (params?: Expand) => { + return this.appClient.params.bare.delete(params) + }, + }, + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * @@ -1201,14 +1339,14 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call params */ - getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetText(params)) }, @@ -1224,6 +1362,30 @@ export class AssetLabelingClient { return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsText(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call params + */ + getAssetsTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.params.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -1278,6 +1440,36 @@ export class AssetLabelingClient { * Create transactions for the current app */ readonly createTransaction = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The update result + */ + bare: (params?: Expand) => { + return this.appClient.createTransaction.bare.update(params) + }, + }, + + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The delete result + */ + bare: (params?: Expand) => { + return this.appClient.createTransaction.bare.delete(params) + }, + }, + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * @@ -1467,14 +1659,14 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call transaction */ - getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetText(params)) }, @@ -1490,6 +1682,30 @@ export class AssetLabelingClient { return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsText(params)) }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call transaction + */ + getAssetsTextLabels: (params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + return this.appClient.createTransaction.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + }, + /** * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -1544,6 +1760,36 @@ export class AssetLabelingClient { * Send calls to the current app */ readonly send = { + /** + * Gets available update methods + */ + update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The update result + */ + bare: (params?: Expand) => { + return this.appClient.send.bare.update(params) + }, + }, + + /** + * Gets available delete methods + */ + delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param params The params for the bare (raw) call + * @returns The delete result + */ + bare: (params?: Expand) => { + return this.appClient.send.bare.delete(params) + }, + }, + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * @@ -1749,16 +1995,16 @@ export class AssetLabelingClient { }, /** - * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call result */ - getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + getAssetText: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) - return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'])} + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'])} }, /** @@ -1774,6 +2020,32 @@ export class AssetLabelingClient { return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_text(uint64[])void'])} }, + /** + * Makes a call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetTextLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'])} + }, + + /** + * Makes a call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + getAssetsTextLabels: async (params: CallParams & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + return {...result, return: result.return as unknown as (undefined | AssetLabelingReturns['get_assets_text_labels(uint64[])void'])} + }, + /** * Makes a call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -1956,16 +2228,16 @@ export class AssetLabelingClient { } /** - * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string[],string)` ABI method. + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text(uint64)(string,string,string,string[])` ABI method. * * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. * * @param params The params for the smart contract call * @returns The call result */ - async getAssetText(params: CallParams) { + async getAssetText(params: CallParams) { const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetText(params)) - return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] + return result.return as unknown as AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] } /** @@ -1981,6 +2253,32 @@ export class AssetLabelingClient { return result.return as unknown as AssetLabelingReturns['get_assets_text(uint64[])void'] } + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_text_labels(uint64)(string,string,string)` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetTextLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetTextLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'] + } + + /** + * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_assets_text_labels(uint64[])void` ABI method. + * + * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction. + * + * @param params The params for the smart contract call + * @returns The call result + */ + async getAssetsTextLabels(params: CallParams) { + const result = await this.appClient.send.call(AssetLabelingParamsFactory.getAssetsTextLabels(params)) + return result.return as unknown as AssetLabelingReturns['get_assets_text_labels(uint64[])void'] + } + /** * Makes a readonly (simulated) call to the AssetLabeling smart contract using the `get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[])` ABI method. * @@ -2244,11 +2542,11 @@ export class AssetLabelingClient { return this }, /** - * Add a get_asset_text(uint64)(string,string,string[],string) method call against the AssetLabeling contract + * Add a get_asset_text(uint64)(string,string,string,string[]) method call against the AssetLabeling contract */ - getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + getAssetText(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetText(params))) - resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string[],string)', v)) + resultMappers.push((v) => client.decodeReturnValue('get_asset_text(uint64)(string,string,string,string[])', v)) return this }, /** @@ -2259,6 +2557,22 @@ export class AssetLabelingClient { resultMappers.push(undefined) return this }, + /** + * Add a get_asset_text_labels(uint64)(string,string,string) method call against the AssetLabeling contract + */ + getAssetTextLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetTextLabels(params))) + resultMappers.push((v) => client.decodeReturnValue('get_asset_text_labels(uint64)(string,string,string)', v)) + return this + }, + /** + * Add a get_assets_text_labels(uint64[])void method call against the AssetLabeling contract + */ + getAssetsTextLabels(params: CallParams & {onComplete?: OnApplicationComplete.NoOpOC}) { + promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getAssetsTextLabels(params))) + resultMappers.push(undefined) + return this + }, /** * Add a get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) method call against the AssetLabeling contract */ @@ -2291,6 +2605,22 @@ export class AssetLabelingClient { resultMappers.push(undefined) return this }, + get update() { + return { + bare: (params?: AppClientBareCallParams & AppClientCompilationParams ) => { + promiseChain = promiseChain.then(async () => composer.addAppUpdate(await client.params.update.bare(params))) + return this + }, + } + }, + get delete() { + return { + bare: (params?: AppClientBareCallParams ) => { + promiseChain = promiseChain.then(() => composer.addAppDelete(client.params.delete.bare(params))) + return this + }, + } + }, /** * Add a clear state call to the AssetLabeling contract */ @@ -2471,13 +2801,13 @@ export type AssetLabelingComposer = { getAssetsMicroLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_micro_labels(uint64[])void'] | undefined]> /** - * Calls the get_asset_text(uint64)(string,string,string[],string) ABI method. + * Calls the get_asset_text(uint64)(string,string,string,string[]) ABI method. * * @param args The arguments for the contract call * @param params Any additional parameters for the call * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions */ - getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string[],string)'] | undefined]> + getAssetText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text(uint64)(string,string,string,string[])'] | undefined]> /** * Calls the get_assets_text(uint64[])void ABI method. @@ -2488,6 +2818,24 @@ export type AssetLabelingComposer = { */ getAssetsText(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_text(uint64[])void'] | undefined]> + /** + * Calls the get_asset_text_labels(uint64)(string,string,string) ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetTextLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_asset_text_labels(uint64)(string,string,string)'] | undefined]> + + /** + * Calls the get_assets_text_labels(uint64[])void ABI method. + * + * @param args The arguments for the contract call + * @param params Any additional parameters for the call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + getAssetsTextLabels(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_text_labels(uint64[])void'] | undefined]> + /** * Calls the get_asset_small(uint64)(string,string,uint8,uint64,bool,bool,string[]) ABI method. * @@ -2524,6 +2872,32 @@ export type AssetLabelingComposer = { */ getAssetsFull(params?: CallParams): AssetLabelingComposer<[...TReturns, AssetLabelingReturns['get_assets_full(uint64[])void'] | undefined]> + /** + * Gets available delete methods + */ + readonly delete: { + /** + * Deletes an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + bare(params?: AppClientBareCallParams ): AssetLabelingComposer<[...TReturns, undefined]> + } + + /** + * Gets available update methods + */ + readonly update: { + /** + * Updates an existing instance of the AssetLabeling smart contract using a bare call. + * + * @param args The arguments for the bare call + * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions + */ + bare(params?: AppClientBareCallParams ): AssetLabelingComposer<[...TReturns, undefined]> + } + /** * Makes a clear_state call to an existing instance of the AssetLabeling smart contract. * diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py index d8836c9..ad91783 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/contract.py @@ -22,13 +22,17 @@ AssetMicroLabels, AssetSmall, AssetText, + AssetTextLabels, LabelDescriptor, LabelList, S, ) -NOT_FOUND_KEY = 2**32 # magic constant for "list not found" -NOT_FOUND_VALUE = 2**32 - 1 # magic constant for "not found in list" +# constants used to return from index-finding functions. zero is a truthy return, so: +NOT_FOUND_KEY = ( + 2**32 +) # magic constant for "list not found" (e.g. box key missing entirely) +NOT_FOUND_VALUE = 2**32 - 1 # magic constant for "value not found in list" @subroutine @@ -56,6 +60,14 @@ def __init__(self) -> None: self.assets = BoxMap(Asset, LabelList, key_prefix=b"") self.operators = BoxMap(Account, LabelList, key_prefix=b"") + @arc4.baremethod(allow_actions=("UpdateApplication",)) + def update(self) -> None: + self.admin_only() + + @arc4.baremethod(allow_actions=("DeleteApplication",)) + def delete(self) -> None: + self.admin_only() + @subroutine def admin_only(self) -> None: ensure(Txn.sender == self.admin, S("ERR:UNAUTH")) @@ -80,7 +92,6 @@ def add_label(self, id: String, name: String) -> None: def remove_label(self, id: String) -> None: self.admin_only() ensure(id in self.labels, S("ERR:NOEXIST")) - ensure(id.bytes.length == 2, S("ERR:LENGTH")) ensure(self.labels[id].num_assets == 0, S("ERR:NOEMPTY")) del self.labels[id] @@ -94,6 +105,8 @@ def log_labels(self, ids: arc4.DynamicArray[arc4.String]) -> None: for _idx, label_id in uenumerate(ids): log(self.labels[label_id.native]) + # TODO change label names? + # operator<>label access ops. admin and operators @subroutine @@ -104,10 +117,10 @@ def admin_or_operator_only(self, label: String) -> None: @subroutine def operator_only(self, label: String) -> None: + operator_index = self.get_operator_label_index(Txn.sender, label) ensure( - self.get_operator_label_index(Txn.sender, label) != UInt64(NOT_FOUND_KEY) - and self.get_operator_label_index(Txn.sender, label) - != UInt64(NOT_FOUND_VALUE), + operator_index != UInt64(NOT_FOUND_KEY) + and operator_index != UInt64(NOT_FOUND_VALUE), S("ERR:UNAUTH"), ) @@ -330,7 +343,7 @@ def get_assets_micro_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> Non for _i, asset_id in uenumerate(assets): log(self._get_asset_micro_labels(asset_id.native)) - # Text: Searchable - Asset name, Unit Name, URL, Labels (2 refs, max 64) + # Text: Searchable - Asset name, Unit Name, URL (1 ref, max 128) @subroutine def _get_asset_text(self, asset_id: UInt64) -> AssetText: @@ -351,6 +364,26 @@ def get_assets_text(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: for _i, asset_id in uenumerate(assets): log(self._get_asset_text(asset_id.native)) + # TextLabels: Searchable - Asset name, Unit Name, URL, Labels (2 refs, max 64) + + @subroutine + def _get_asset_text_labels(self, asset_id: UInt64) -> AssetTextLabels: + asset = Asset(asset_id) + return AssetTextLabels( + name=b2str(asset.name), + unit_name=b2str(asset.unit_name), + url=b2str(asset.url), + ) + + @abimethod(readonly=True) + def get_asset_text_labels(self, asset: UInt64) -> AssetTextLabels: + return self._get_asset_text_labels(asset) + + @abimethod(readonly=True) + def get_assets_text_labels(self, assets: arc4.DynamicArray[arc4.UInt64]) -> None: + for _i, asset_id in uenumerate(assets): + log(self._get_asset_text_labels(asset_id.native)) + # small (2 refs, max 64) @subroutine diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/deploy-config.ts b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/deploy-config.ts index a458509..8889b94 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/deploy-config.ts +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/deploy-config.ts @@ -12,7 +12,7 @@ export async function deploy() { defaultSender: deployer.addr, }) - const { appClient, result } = await factory.deploy({ onUpdate: 'append', onSchemaBreak: 'append' }) + const { appClient, result } = await factory.deploy({ onUpdate: 'update', onSchemaBreak: 'append' }) // If app was just created fund the app account if (['create', 'replace'].includes(result.operationPerformed)) { diff --git a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py index fd85205..6e5fd84 100644 --- a/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py +++ b/projects/asset_labeling-contracts/smart_contracts/asset_labeling/types.py @@ -28,7 +28,14 @@ class AssetMicroLabels(arc4.Struct): class AssetText(arc4.Struct): name: arc4.String unit_name: arc4.String + url: arc4.String labels: LabelList + + +# Searchable text view plusllabels +class AssetTextLabels(arc4.Struct): + name: arc4.String + unit_name: arc4.String url: arc4.String @@ -58,7 +65,5 @@ class AssetFull(arc4.Struct): reserve: arc4.Address metadata_hash: arc4.DynamicBytes - reserve_balance: arc4.UInt64 - labels: LabelList diff --git a/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts b/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts index 41f773c..c1ec56c 100644 --- a/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts +++ b/projects/asset_labeling-contracts/tests/asset-labeling.spec.ts @@ -16,27 +16,17 @@ import { removeLabel, removeOperatorFromLabel, removeLabelFromAsset, -} from './sdk' - -// TODO: -// add_label as nonadmin (operator?) should fail -// remove_label as nonadmin (operator?) should fail -// add_op as operator -// remove_op as operator -// add_op nonexist label should fail -// remove_op nonexist label should fail - -const config = { - populateAppCallResources: true, - debug: false, - traceAll: false, -} +} from './helpers' describe('asset labeling contract', () => { const localnet = algorandFixture() beforeAll(() => { - Config.configure(config) + Config.configure({ + populateAppCallResources: true, + debug: false, + traceAll: false, + }) }) beforeEach(localnet.newScope) diff --git a/projects/asset_labeling-contracts/tests/sdk.ts b/projects/asset_labeling-contracts/tests/helpers.ts similarity index 100% rename from projects/asset_labeling-contracts/tests/sdk.ts rename to projects/asset_labeling-contracts/tests/helpers.ts