From 7804d33f6c97288f6190696fd59aa9746ef599e1 Mon Sep 17 00:00:00 2001 From: Bobby Lat Date: Mon, 24 Nov 2025 10:49:19 +0800 Subject: [PATCH 1/4] chore: refresh test artifacts with puya 5.5.0 --- .../AVM12/data/Contract.approval.teal | 14 +- .../artifacts/AVM12/data/Contract.arc56.json | 30 +- .../artifacts/AVM12/data/Contract.clear.teal | 2 +- .../AVM12/data/ContractV0.approval.teal | 8 +- .../AVM12/data/ContractV0.arc56.json | 24 +- .../AVM12/data/ContractV0.clear.teal | 2 +- .../AVM12/data/ContractV1.approval.teal | 8 +- .../AVM12/data/ContractV1.arc56.json | 24 +- .../AVM12/data/ContractV1.clear.teal | 2 +- .../data/SignaturesContract.approval.teal | 32 +- .../data/SignaturesContract.arc56.json | 54 ++- .../data/SignaturesContract.clear.teal | 2 +- .../data/Arc4InnerTxnsContract.approval.teal | 8 +- .../data/Arc4InnerTxnsContract.arc56.json | 25 +- .../data/Arc4InnerTxnsContract.clear.teal | 2 +- .../Arc4PrimitiveOpsContract.approval.teal | 28 +- .../data/Arc4PrimitiveOpsContract.arc56.json | 150 ++++---- .../data/Arc4PrimitiveOpsContract.clear.teal | 2 +- .../Arrays/data/Contract.approval.teal | 364 +++++++++--------- .../artifacts/Arrays/data/Contract.arc56.json | 110 +++--- .../artifacts/Arrays/data/Contract.clear.teal | 2 +- .../DynamicArrayInitContract.approval.teal | 130 +++---- .../data/DynamicArrayInitContract.arc56.json | 25 +- .../data/DynamicArrayInitContract.clear.teal | 2 +- .../data/ImmutableArrayContract.approval.teal | 214 +++++----- .../data/ImmutableArrayContract.arc56.json | 214 +++++----- .../data/ImmutableArrayContract.clear.teal | 2 +- .../data/StaticSizeContract.approval.teal | 36 +- .../Arrays/data/StaticSizeContract.arc56.json | 100 +++-- .../Arrays/data/StaticSizeContract.clear.teal | 2 +- .../data/BoxContract.approval.teal | 96 ++--- .../BoxContract/data/BoxContract.arc56.json | 62 ++- .../BoxContract/data/BoxContract.clear.teal | 2 +- .../Contains/data/MyContract.approval.teal | 2 +- .../Contains/data/MyContract.clear.teal | 2 +- .../data/AppCall.approval.teal | 8 +- .../CreatedAppAsset/data/AppCall.arc56.json | 25 +- .../CreatedAppAsset/data/AppCall.clear.teal | 2 +- .../data/AppExpectingEffects.approval.teal | 15 +- .../data/AppExpectingEffects.arc56.json | 42 +- .../data/AppExpectingEffects.clear.teal | 2 +- .../data/CryptoOpsContract.approval.teal | 16 +- .../data/CryptoOpsContract.arc56.json | 25 +- .../data/CryptoOpsContract.clear.teal | 2 +- .../data/GlobalStateValidator.approval.teal | 10 +- .../data/GlobalStateValidator.arc56.json | 24 +- .../data/GlobalStateValidator.clear.teal | 2 +- .../MiscellaneousOpsContract.approval.teal | 6 +- .../data/MiscellaneousOpsContract.arc56.json | 25 +- .../data/MiscellaneousOpsContract.clear.teal | 2 +- .../data/PrimitiveOpsContract.approval.teal | 4 +- .../data/PrimitiveOpsContract.arc56.json | 25 +- .../data/PrimitiveOpsContract.clear.teal | 2 +- .../data/StateMutations.approval.teal | 6 +- .../data/StateMutations.arc56.json | 110 +++--- .../data/StateMutations.clear.teal | 2 +- .../data/GlobalStateContract.approval.teal | 4 +- .../data/GlobalStateContract.arc56.json | 52 +-- .../data/GlobalStateContract.clear.teal | 2 +- .../data/ITxnOpsContract.approval.teal | 6 +- .../StateOps/data/ITxnOpsContract.arc56.json | 25 +- .../StateOps/data/ITxnOpsContract.clear.teal | 2 +- .../data/LocalStateContract.approval.teal | 6 +- .../data/LocalStateContract.arc56.json | 58 +-- .../data/LocalStateContract.clear.teal | 2 +- .../StateAcctParamsGetContract.approval.teal | 6 +- .../StateAcctParamsGetContract.arc56.json | 98 +++-- .../StateAcctParamsGetContract.clear.teal | 2 +- .../data/StateAppGlobalContract.approval.teal | 4 +- .../data/StateAppGlobalContract.arc56.json | 25 +- .../data/StateAppGlobalContract.clear.teal | 2 +- .../StateAppGlobalExContract.approval.teal | 6 +- .../data/StateAppGlobalExContract.arc56.json | 19 +- .../data/StateAppGlobalExContract.clear.teal | 2 +- .../data/StateAppLocalContract.approval.teal | 10 +- .../data/StateAppLocalContract.arc56.json | 31 +- .../data/StateAppLocalContract.clear.teal | 2 +- .../StateAppLocalExContract.approval.teal | 12 +- .../data/StateAppLocalExContract.arc56.json | 25 +- .../data/StateAppLocalExContract.clear.teal | 2 +- .../data/StateAppParamsContract.approval.teal | 4 +- .../data/StateAppParamsContract.arc56.json | 50 +-- .../data/StateAppParamsContract.clear.teal | 2 +- .../StateAssetHoldingContract.approval.teal | 10 +- .../data/StateAssetHoldingContract.arc56.json | 25 +- .../data/StateAssetHoldingContract.clear.teal | 2 +- .../StateAssetParamsContract.approval.teal | 6 +- .../data/StateAssetParamsContract.arc56.json | 56 ++- .../data/StateAssetParamsContract.clear.teal | 2 +- .../Tuples/data/TuplesContract.approval.teal | 6 +- .../Tuples/data/TuplesContract.arc56.json | 25 +- .../Tuples/data/TuplesContract.clear.teal | 2 +- 92 files changed, 1148 insertions(+), 1582 deletions(-) diff --git a/tests/artifacts/AVM12/data/Contract.approval.teal b/tests/artifacts/AVM12/data/Contract.approval.teal index cb7794dc..56a7c853 100644 --- a/tests/artifacts/AVM12/data/Contract.approval.teal +++ b/tests/artifacts/AVM12/data/Contract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@9 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xbe56499c 0xac8aab42 // method "test_falcon_verify()void", method "test_reject_version()void" @@ -25,8 +25,6 @@ main___algopy_default_create@9: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -34,15 +32,17 @@ main___algopy_default_create@9: test_falcon_verify: // tests/artifacts/AVM12/contract.py:7 // assert not op.falcon_verify(b"", b"", op.bzero(1793)) - pushint 1793 // 1793 + pushint 1793 bzero pushbytes 0x dup uncover 2 falcon_verify ! + assert // tests/artifacts/AVM12/contract.py:5 // @arc4.abimethod + intc_0 // 1 return @@ -53,7 +53,7 @@ test_reject_version: itxn_begin bytec_0 // base64(DIEBQw==) itxn_field ClearStateProgramPages - pushbytes base64(DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAsxGRQxGBQQRIEBQzFEgQESRIEBQw==) + pushbytes base64(DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQw==) itxn_field ApprovalProgramPages intc_1 // appl itxn_field TypeEnum @@ -77,7 +77,7 @@ test_reject_version: // ContractV0.update, app_id=app, reject_version=1, compiled=compile_contract(ContractV1) bytec_0 // base64(DIEBQw==) itxn_field ClearStateProgramPages - pushbytes base64(DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAsxGRQxGBQQRIEBQzFEgQISRIEBQw==) + pushbytes base64(DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQw==) itxn_field ApprovalProgramPages // tests/artifacts/AVM12/contract.py:15-17 // arc4.arc4_update( @@ -124,7 +124,7 @@ test_reject_version: itxn_begin // tests/artifacts/AVM12/contract.py:28 // reject_version=2, - pushint 2 // 2 + pushint 2 itxn_field RejectVersion itxn_field ApplicationID // tests/artifacts/AVM12/contract.py:26 diff --git a/tests/artifacts/AVM12/data/Contract.arc56.json b/tests/artifacts/AVM12/data/Contract.arc56.json index 8d3ae9f8..e69b6b46 100644 --- a/tests/artifacts/AVM12/data/Contract.arc56.json +++ b/tests/artifacts/AVM12/data/Contract.arc56.json @@ -73,32 +73,20 @@ "sourceInfo": [ { "pc": [ - 21 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 54 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 141, - 232 + 138, + 226 ], "errorMessage": "application exists" }, { "pc": [ - 143 + 140 ], "errorMessage": "should be version 0" }, { "pc": [ - 235 + 229 ], "errorMessage": "should be version 1" } @@ -111,19 +99,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGJlNTY0OTljIDB4YWM4YWFiNDIgLy8gbWV0aG9kICJ0ZXN0X2ZhbGNvbl92ZXJpZnkoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVqZWN0X3ZlcnNpb24oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ZhbGNvbl92ZXJpZnkgdGVzdF9yZWplY3RfdmVyc2lvbgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdC50ZXN0X2ZhbGNvbl92ZXJpZnlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZhbGNvbl92ZXJpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NwogICAgLy8gYXNzZXJ0IG5vdCBvcC5mYWxjb25fdmVyaWZ5KGIiIiwgYiIiLCBvcC5iemVybygxNzkzKSkKICAgIHB1c2hpbnQgMTc5MyAvLyAxNzkzCiAgICBiemVybwogICAgcHVzaGJ5dGVzIDB4CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZmFsY29uX3ZlcmlmeQogICAgIQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFWTTEyLmNvbnRyYWN0LkNvbnRyYWN0LnRlc3RfcmVqZWN0X3ZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3JlamVjdF92ZXJzaW9uOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjExCiAgICAvLyBhcHBfdjBfdHhuID0gYXJjNC5hcmM0X2NyZWF0ZShDb250cmFjdFYwKQogICAgaXR4bl9iZWdpbgogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVNnNkJoeU5ob0FqZ0VBQVFBeEdZRUVFakVZRUVSQ0FBc3hHUlF4R0JRUVJJRUJRekZFZ1FFU1JJRUJRdz09KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxMwogICAgLy8gYXNzZXJ0IGFwcC52ZXJzaW9uID09IDAsICJzaG91bGQgYmUgdmVyc2lvbiAwIgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBWZXJzaW9uCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE1LTE3CiAgICAvLyBhcmM0LmFyYzRfdXBkYXRlKAogICAgLy8gICAgIENvbnRyYWN0VjAudXBkYXRlLCBhcHBfaWQ9YXBwLCByZWplY3RfdmVyc2lvbj0xLCBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KENvbnRyYWN0VjEpCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTYKICAgIC8vIENvbnRyYWN0VjAudXBkYXRlLCBhcHBfaWQ9YXBwLCByZWplY3RfdmVyc2lvbj0xLCBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KENvbnRyYWN0VjEpCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBUWtONDA4TmhvQWpnRUFBUUF4R1lFRkVqRVlFRVJDQUFzeEdSUXhHQlFRUklFQlF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBSZWplY3RWZXJzaW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyNgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIyLTI0CiAgICAvLyBhcmM0LmFyYzRfc2lnbmF0dXJlKAogICAgLy8gICAgIENvbnRyYWN0VjEuZGVsZXRlLAogICAgLy8gKSwKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18yIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAtMjkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPSgKICAgIC8vICAgICAgICAgYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICAgICAgICAgIENvbnRyYWN0VjEuZGVsZXRlLAogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgcmVqZWN0X3ZlcnNpb249MiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMAogICAgYnl0ZWNibG9jayBiYXNlNjQoRElFQlF3PT0pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMik6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiZTU2NDk5YyAweGFjOGFhYjQyIC8vIG1ldGhvZCAidGVzdF9mYWxjb25fdmVyaWZ5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlamVjdF92ZXJzaW9uKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9mYWxjb25fdmVyaWZ5IHRlc3RfcmVqZWN0X3ZlcnNpb24KICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9mYWxjb25fdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9mYWxjb25fdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBub3Qgb3AuZmFsY29uX3ZlcmlmeShiIiIsIGIiIiwgb3AuYnplcm8oMTc5MykpCiAgICBwdXNoaW50IDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQVZNMTIuY29udHJhY3QuQ29udHJhY3QudGVzdF9yZWplY3RfdmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVqZWN0X3ZlcnNpb246CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTEKICAgIC8vIGFwcF92MF90eG4gPSBhcmM0LmFyYzRfY3JlYXRlKENvbnRyYWN0VjApCiAgICBpdHhuX2JlZ2luCiAgICBieXRlY18wIC8vIGJhc2U2NChESUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChEREViUVFBYWdBU2c2Qmh5TmhvQWpnRUFBUUF4R1lFRUVqRVlFRVJDQUFneEdSUXhHQlFRUXpGRWdRRVNSSUVCUXc9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAwLCAic2hvdWxkIGJlIHZlcnNpb24gMCIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNob3VsZCBiZSB2ZXJzaW9uIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNS0xNwogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZSgKICAgIC8vICAgICBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBDb250cmFjdFYwLnVwZGF0ZSwgYXBwX2lkPWFwcCwgcmVqZWN0X3ZlcnNpb249MSwgY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdChDb250cmFjdFYxKQogICAgYnl0ZWNfMCAvLyBiYXNlNjQoRElFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoRERFYlFRQWFnQVFrTjQwOE5ob0FqZ0VBQVFBeEdZRUZFakVZRUVSQ0FBZ3hHUlF4R0JRUVF6RkVnUUlTUklFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToxNgogICAgLy8gQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFJlamVjdFZlcnNpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTUtMTcKICAgIC8vIGFyYzQuYXJjNF91cGRhdGUoCiAgICAvLyAgICAgQ29udHJhY3RWMC51cGRhdGUsIGFwcF9pZD1hcHAsIHJlamVjdF92ZXJzaW9uPTEsIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoQ29udHJhY3RWMSkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MTgKICAgIC8vIGFzc2VydCBhcHAudmVyc2lvbiA9PSAxLCAic2hvdWxkIGJlIHZlcnNpb24gMSIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwVmVyc2lvbgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gc2hvdWxkIGJlIHZlcnNpb24gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjgKICAgIC8vIHJlamVjdF92ZXJzaW9uPTIsCiAgICBwdXNoaW50IDIKICAgIGl0eG5fZmllbGQgUmVqZWN0VmVyc2lvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjYKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weToyMi0yNAogICAgLy8gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICksCiAgICBwdXNoYnl0ZXMgMHgyNDM3OGQzYyAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MjAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjIwLTI5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oCiAgICAvLyAgICAgICAgIGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgICAgICAgICBDb250cmFjdFYxLmRlbGV0ZSwKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gICAgIHJlamVjdF92ZXJzaW9uPTIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAsAFwAxGRQxGBQQRCJDgYEOr4AASU8ChRRDsSiyQoA0DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAsxGRQxGBQQRIEBQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoA0DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAsxGRQxGBQQRIEBQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD", + "approval": "DCADAQYAJgEEDIEBQzEbQQAdMRkURDEYRIICBL5WSZwErIqrQjYaAI4CAAkAFwAxGRQxGBQQQ4GBDq+AAElPAoUURCJDsSiyQoAxDDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQ7JAI7IQJLIBs7Q9SXIJRBREsSiyQoAxDDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQ7JAgQSyGSKyREmyGIAEoOgYcrIaI7IQJLIBs0lyCUQiEkSxgQKyRLIYgQWyGYAEJDeNPLIaI7IQJLIBsyJD", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/AVM12/data/Contract.clear.teal b/tests/artifacts/AVM12/data/Contract.clear.teal index e5edc31e..a87aa802 100644 --- a/tests/artifacts/AVM12/data/Contract.clear.teal +++ b/tests/artifacts/AVM12/data/Contract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/AVM12/data/ContractV0.approval.teal b/tests/artifacts/AVM12/data/ContractV0.approval.teal index 5ab30548..03dc886b 100644 --- a/tests/artifacts/AVM12/data/ContractV0.approval.teal +++ b/tests/artifacts/AVM12/data/ContractV0.approval.teal @@ -20,7 +20,7 @@ main_update_route@3: == txn ApplicationID && - assert // OnCompletion must be UpdateApplication && can only call when not creating + assert b update main___algopy_default_create@5: @@ -29,8 +29,6 @@ main___algopy_default_create@5: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return @@ -39,7 +37,7 @@ update: // tests/artifacts/AVM12/contract.py:36 // Txn.reject_version == 1 txn RejectVersion - pushint 1 // 1 + pushint 1 == // tests/artifacts/AVM12/contract.py:35-37 // assert ( @@ -48,5 +46,5 @@ update: assert // can only update if caller expects this to be currently be v0 // tests/artifacts/AVM12/contract.py:33 // @arc4.abimethod(allow_actions=("UpdateApplication",)) - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/AVM12/data/ContractV0.arc56.json b/tests/artifacts/AVM12/data/ContractV0.arc56.json index f4bfd8cc..373a6446 100644 --- a/tests/artifacts/AVM12/data/ContractV0.arc56.json +++ b/tests/artifacts/AVM12/data/ContractV0.arc56.json @@ -57,19 +57,7 @@ "sourceInfo": [ { "pc": [ - 39 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 28 - ], - "errorMessage": "OnCompletion must be UpdateApplication && can only call when not creating" - }, - { - "pc": [ - 48 + 45 ], "errorMessage": "can only update if caller expects this to be currently be v0" } @@ -82,19 +70,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgVXBkYXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB1cGRhdGUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFWTTEyLmNvbnRyYWN0LkNvbnRyYWN0VjAudXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBUeG4ucmVqZWN0X3ZlcnNpb24gPT0gMQogICAgdHhuIFJlamVjdFZlcnNpb24KICAgIHB1c2hpbnQgMSAvLyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjM1LTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5yZWplY3RfdmVyc2lvbiA9PSAxCiAgICAvLyApLCAiY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwIgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IHVwZGF0ZSBpZiBjYWxsZXIgZXhwZWN0cyB0aGlzIHRvIGJlIGN1cnJlbnRseSBiZSB2MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozMgogICAgLy8gY2xhc3MgQ29udHJhY3RWMChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweGEwZTgxODcyIC8vIG1ldGhvZCAidXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl91cGRhdGVfcm91dGVAMwogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIlVwZGF0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgdXBkYXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYwLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTozNgogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzUtMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDEKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjAiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiVXBkYXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAsxGRQxGBQQRIEBQzFEgQESRIEBQw==", + "approval": "DDEbQQAagASg6BhyNhoAjgEAAQAxGYEEEjEYEERCAAgxGRQxGBQQQzFEgQESRIEBQw==", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/AVM12/data/ContractV0.clear.teal b/tests/artifacts/AVM12/data/ContractV0.clear.teal index e5edc31e..a87aa802 100644 --- a/tests/artifacts/AVM12/data/ContractV0.clear.teal +++ b/tests/artifacts/AVM12/data/ContractV0.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/AVM12/data/ContractV1.approval.teal b/tests/artifacts/AVM12/data/ContractV1.approval.teal index 57ad3229..cf4d4701 100644 --- a/tests/artifacts/AVM12/data/ContractV1.approval.teal +++ b/tests/artifacts/AVM12/data/ContractV1.approval.teal @@ -20,7 +20,7 @@ main_delete_route@3: == txn ApplicationID && - assert // OnCompletion must be DeleteApplication && can only call when not creating + assert b delete main___algopy_default_create@5: @@ -29,8 +29,6 @@ main___algopy_default_create@5: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return @@ -39,7 +37,7 @@ delete: // tests/artifacts/AVM12/contract.py:44 // Txn.reject_version == 2 txn RejectVersion - pushint 2 // 2 + pushint 2 == // tests/artifacts/AVM12/contract.py:43-45 // assert ( @@ -48,5 +46,5 @@ delete: assert // can only update if caller expects this to be currently be v1 // tests/artifacts/AVM12/contract.py:41 // @arc4.abimethod(allow_actions=("DeleteApplication",)) - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/AVM12/data/ContractV1.arc56.json b/tests/artifacts/AVM12/data/ContractV1.arc56.json index 7e07a8d5..efc6c316 100644 --- a/tests/artifacts/AVM12/data/ContractV1.arc56.json +++ b/tests/artifacts/AVM12/data/ContractV1.arc56.json @@ -57,19 +57,7 @@ "sourceInfo": [ { "pc": [ - 28 - ], - "errorMessage": "OnCompletion must be DeleteApplication && can only call when not creating" - }, - { - "pc": [ - 39 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 48 + 45 ], "errorMessage": "can only update if caller expects this to be currently be v1" } @@ -82,19 +70,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgRGVsZXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBkZWxldGUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFWTTEyLmNvbnRyYWN0LkNvbnRyYWN0VjEuZGVsZXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBUeG4ucmVqZWN0X3ZlcnNpb24gPT0gMgogICAgdHhuIFJlamVjdFZlcnNpb24KICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQzLTQ1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIFR4bi5yZWplY3RfdmVyc2lvbiA9PSAyCiAgICAvLyApLCAiY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxIgogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IHVwZGF0ZSBpZiBjYWxsZXIgZXhwZWN0cyB0aGlzIHRvIGJlIGN1cnJlbnRseSBiZSB2MQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0MAogICAgLy8gY2xhc3MgQ29udHJhY3RWMShBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTEyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDUKICAgIHB1c2hieXRlcyAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVAMwogICAgZXJyCgptYWluX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FWTTEyL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz0oIkRlbGV0ZUFwcGxpY2F0aW9uIiwpKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BVk0xMi5jb250cmFjdC5Db250cmFjdFYxLmRlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BVk0xMi9jb250cmFjdC5weTo0NAogICAgLy8gVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIHR4biBSZWplY3RWZXJzaW9uCiAgICBwdXNoaW50IDIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDMtNDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnJlamVjdF92ZXJzaW9uID09IDIKICAgIC8vICksICJjYW4gb25seSB1cGRhdGUgaWYgY2FsbGVyIGV4cGVjdHMgdGhpcyB0byBiZSBjdXJyZW50bHkgYmUgdjEiCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgdXBkYXRlIGlmIGNhbGxlciBleHBlY3RzIHRoaXMgdG8gYmUgY3VycmVudGx5IGJlIHYxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQVZNMTIvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPSgiRGVsZXRlQXBwbGljYXRpb24iLCkpCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAsxGRQxGBQQRIEBQzFEgQISRIEBQw==", + "approval": "DDEbQQAagAQkN408NhoAjgEAAQAxGYEFEjEYEERCAAgxGRQxGBQQQzFEgQISRIEBQw==", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/AVM12/data/ContractV1.clear.teal b/tests/artifacts/AVM12/data/ContractV1.clear.teal index e5edc31e..a87aa802 100644 --- a/tests/artifacts/AVM12/data/ContractV1.clear.teal +++ b/tests/artifacts/AVM12/data/ContractV1.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal index 9b1379f0..eb3ed524 100644 --- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal @@ -9,7 +9,7 @@ main: // class SignaturesContract(ARC4Contract): txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID bz main_create_NoOp@13 pushbytess 0xe18922d8 0x3b05cf17 0x0658dcc3 0x5b6447de 0x061f4e77 0xeaa89139 0x510e72a4 0xd6c2ac7f 0x48142d5e // method "sink(string,uint8[])void", method "alias(string,uint8[])void", method "with_txn(string,pay,uint8[])void", method "with_asset(string,asset,uint8[])void", method "with_app(string,application,uint64,uint8[])void", method "with_acc(string,account,uint8[])void", method "complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))", method "echo_resource_by_index(asset,application,account)(uint64,uint64,address)", method "echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)" @@ -83,8 +83,10 @@ sink: // assert arr bytec_0 // 0x0000 != + assert // tests/artifacts/Arc4ABIMethod/contract.py:36 // @arc4.abimethod(validate_encoding="unsafe_disabled") + intc_0 // 1 return @@ -103,8 +105,10 @@ sink2: // assert arr bytec_0 // 0x0000 != + assert // tests/artifacts/Arc4ABIMethod/contract.py:41 // @arc4.abimethod(name="alias") + intc_0 // 1 return @@ -150,8 +154,10 @@ with_txn: gtxns Amount intc_3 // 123 == + assert // tests/artifacts/Arc4ABIMethod/contract.py:46 // @arc4.abimethod + intc_0 // 1 return @@ -187,8 +193,10 @@ with_asset: // assert Txn.assets(0) == asset txna Assets 0 == + assert // tests/artifacts/Arc4ABIMethod/contract.py:54 // @arc4.abimethod(resource_encoding="index") + intc_0 // 1 return @@ -262,8 +270,10 @@ with_app: // assert Txn.applications(1) == app txna Applications 1 == + assert // tests/artifacts/Arc4ABIMethod/contract.py:61 // @arc4.abimethod(resource_encoding="index") + intc_0 // 1 return @@ -295,7 +305,7 @@ with_acc: dig 1 acct_params_get AcctMinBalance assert // account funded - pushint 1234 // 1234 + pushint 1234 + == assert @@ -309,8 +319,10 @@ with_acc: // assert Txn.accounts(1) == acc txna Accounts 1 == + assert // tests/artifacts/Arc4ABIMethod/contract.py:75 // @arc4.abimethod(resource_encoding="index") + intc_0 // 1 return @@ -331,7 +343,7 @@ complex_sig: dup intc_1 // 0 extract_uint16 // on error: invalid array length header - pushint 2 // 2 + pushint 2 + dig 1 len @@ -340,7 +352,7 @@ complex_sig: // tests/artifacts/Arc4ABIMethod/contract.py:88 // assert Txn.num_app_args == 4 txn NumAppArgs - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arc4ABIMethod/contract.py:89-90 @@ -350,7 +362,7 @@ complex_sig: intc_1 // 0 extract_uint16 dig 4 - pushint 2 // 2 + pushint 2 extract_uint16 dig 5 uncover 2 @@ -366,7 +378,7 @@ complex_sig: // assert struct1.another_struct.one == 1 // assert struct1.another_struct.two == "2" dup - pushint 8 // 8 + pushint 8 extract_uint16 dig 1 len @@ -396,7 +408,7 @@ complex_sig: // assert struct1.another_struct_alias.one == 1 // assert struct1.another_struct_alias.two == "2" dup - pushint 8 // 8 + pushint 8 extract_uint16 dig 1 len @@ -447,7 +459,7 @@ complex_sig: uncover 4 acct_params_get AcctMinBalance assert // account funded - pushint 1234 // 1234 + pushint 1234 + == assert @@ -460,7 +472,7 @@ complex_sig: assert // tests/artifacts/Arc4ABIMethod/contract.py:83 // @arc4.abimethod(resource_encoding="index") - pushint 4 // 4 + pushint 4 + itob extract 6 2 @@ -558,7 +570,7 @@ echo_resource_by_value: // acc.validate() dup len - pushint 32 // 32 + pushint 32 == assert // invalid number of bytes for arc4.static_array // tests/artifacts/Arc4ABIMethod/contract.py:128 diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json index 15804810..190ec6f8 100644 --- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json @@ -346,70 +346,64 @@ "sourceInfo": [ { "pc": [ - 33 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 338, - 343, - 535, - 540 + 348, + 353, + 547, + 552 ], "errorMessage": "account funded" }, { "pc": [ - 276 + 284 ], "errorMessage": "application exists" }, { "pc": [ - 236 + 242 ], "errorMessage": "asset exists" }, { "pc": [ - 627 + 639 ], "errorMessage": "expected account to be passed by index" }, { "pc": [ - 681 + 693 ], "errorMessage": "expected account to be passed by value" }, { "pc": [ - 272 + 280 ], "errorMessage": "expected app id to match provided app id" }, { "pc": [ - 617 + 629 ], "errorMessage": "expected application to be passed by index" }, { "pc": [ - 675 + 687 ], "errorMessage": "expected application to be passed by value" }, { "pc": [ - 607 + 619 ], "errorMessage": "expected asset to be passed by index" }, { "pc": [ - 667 + 679 ], "errorMessage": "expected asset to be passed by value" }, @@ -427,7 +421,7 @@ }, { "pc": [ - 280 + 288 ], "errorMessage": "expected other app to have same creator" }, @@ -440,32 +434,32 @@ }, { "pc": [ - 380 + 392 ], "errorMessage": "invalid array length header" }, { "pc": [ - 388 + 400 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ - 659 + 671 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 129, - 286 + 294 ], "errorMessage": "transaction type is appl" }, { "pc": [ - 186 + 190 ], "errorMessage": "transaction type is pay" } @@ -478,19 +472,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMTMKICAgIHB1c2hieXRlc3MgMHhlMTg5MjJkOCAweDNiMDVjZjE3IDB4MDY1OGRjYzMgMHg1YjY0NDdkZSAweDA2MWY0ZTc3IDB4ZWFhODkxMzkgMHg1MTBlNzJhNCAweGQ2YzJhYzdmIDB4NDgxNDJkNWUgLy8gbWV0aG9kICJzaW5rKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh2YWxpZGF0ZV9lbmNvZGluZz0idW5zYWZlX2Rpc2FibGVkIikKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MwogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MAogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MgogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1OQogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjUKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2NwogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2OQogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NwogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQgLy8gMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMCkgPT0gVHhuLnNlbmRlcgogICAgdHhuYSBBY2NvdW50cyAwCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IFR4bi5hY2NvdW50cygxKSA9PSBhY2MKICAgIHR4bmEgQWNjb3VudHMgMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jb21wbGV4X3NpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbXBsZXhfc2lnOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODcKICAgIC8vIGZpdmUudmFsaWRhdGUoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODgKICAgIC8vIGFzc2VydCBUeG4ubnVtX2FwcF9hcmdzID09IDQKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDUKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODktOTEKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3QudHdvID09ICIyIgogICAgZHVwCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3QudHdvID09ICIyIgogICAgYnl0ZWNfMyAvLyAweDAwMDEzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICBkaWcgNgogICAgbGVuCiAgICBkaWcgNwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICBkdXAKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NAogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5Ny05OAogICAgLy8gIyB0eG4KICAgIC8vIGFzc2VydCB0eG4uZ3JvdXBfaW5kZXggPT0gVHhuLmdyb3VwX2luZGV4IC0gMQogICAgdW5jb3ZlciA0CiAgICBndHhucyBHcm91cEluZGV4CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwMC0xMDEKICAgIC8vICMgYWNjCiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikgPT0gYXJjNC5VSW50OCgxKS5ieXRlcyAgIyBhY2MgYXJyYXkgcmVmCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZGlnIDMKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICB1bmNvdmVyIDQKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQgLy8gMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X2luZGV4W3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV9pbmRleDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2V0X2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTQKICAgIC8vIGFzc2VydCBhc3NldCA9PSBUeG4uYXNzZXRzKGFzc2V0X2lkeCksICJleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBc3NldHMKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSBpbmRleAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE1CiAgICAvLyBhcHBfaWR4ID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygyKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IGFwcCA9PSBUeG4uYXBwbGljYXRpb25zKGFwcF9pZHgpLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHBsaWNhdGlvbiB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYWNjX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBhY2MgPT0gVHhuLmFjY291bnRzKGFjY19pZHgpLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBY2NvdW50cwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LmVjaG9fcmVzb3VyY2VfYnlfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgplY2hvX3Jlc291cmNlX2J5X3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxLTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIHJlc291cmNlX2VuY29kaW5nPSJ2YWx1ZSIsCiAgICAvLyApCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjcKICAgIC8vIGFjYy52YWxpZGF0ZSgpCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjgKICAgIC8vIGFzc2V0X2lkID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gYXNzZXJ0IGFzc2V0LmlkID09IGFzc2V0X2lkLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzAKICAgIC8vIGFwcF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzEKICAgIC8vIGFzc2VydCBhcHAuaWQgPT0gYXBwX2lkLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCBhY2MuYnl0ZXMgPT0gYWRkcmVzcywgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFkZHJlc3MgPSBUeG4uYXBwbGljYXRpb25fYXJncygzKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyMS0xMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4ZTE4OTIyZDggMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSl2b2lkIiwgbWV0aG9kICJhbGlhcyhzdHJpbmcsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX3R4bihzdHJpbmcscGF5LHVpbnQ4W10pdm9pZCIsIG1ldGhvZCAid2l0aF9hc3NldChzdHJpbmcsYXNzZXQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FwcChzdHJpbmcsYXBwbGljYXRpb24sdWludDY0LHVpbnQ4W10pdm9pZCIsIG1ldGhvZCAid2l0aF9hY2Moc3RyaW5nLGFjY291bnQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJjb21wbGV4X3NpZygoKHVpbnQ2NCxzdHJpbmcpLCh1aW50NjQsc3RyaW5nKSx1aW50MTI4LHVpbnQxMjgpLHR4bixhY2NvdW50LHVpbnQ4W10pKCh1aW50NjQsc3RyaW5nKSwoKHVpbnQ2NCxzdHJpbmcpLCh1aW50NjQsc3RyaW5nKSx1aW50MTI4LHVpbnQxMjgpKSIsIG1ldGhvZCAiZWNob19yZXNvdXJjZV9ieV9pbmRleChhc3NldCxhcHBsaWNhdGlvbixhY2NvdW50KSh1aW50NjQsdWludDY0LGFkZHJlc3MpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X3ZhbHVlKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykodWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHNpbmsgc2luazIgd2l0aF90eG4gd2l0aF9hc3NldCB3aXRoX2FwcCB3aXRoX2FjYyBjb21wbGV4X3NpZyBlY2hvX3Jlc291cmNlX2J5X2luZGV4IGVjaG9fcmVzb3VyY2VfYnlfdmFsdWUKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBjbGFzcyBTaWduYXR1cmVzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHB1c2hieXRlcyAweDRjNWM2MWJhIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZCAhPSAwLCAiZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGlkIgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGlkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMQogICAgLy8gb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcyAhPSBvcC5HbG9iYWwuemVyb19hZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzAtMzIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcyAhPSBvcC5HbG9iYWwuemVyb19hZGRyZXNzCiAgICAvLyApLCAiZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBhcHBfdHhuID0gZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbigwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBfaWQgPT0gMCwgImV4cGVjdGVkIHR4biB0byBoYXZlIDAiCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25faWQgPT0gMCwgImV4cGVjdGVkIHR4biB0byBoYXZlIDAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHR4biB0byBoYXZlIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Quc2lua1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbms6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh2YWxpZGF0ZV9lbmNvZGluZz0idW5zYWZlX2Rpc2FibGVkIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Quc2luazJbcm91dGluZ10oKSAtPiB2b2lkOgpzaW5rMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT0iYWxpYXMiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfdHhuW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aF90eG46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTAKICAgIC8vIGFzc2VydCBwYXkuZ3JvdXBfaW5kZXggPT0gMAogICAgZHVwCiAgICBndHhucyBHcm91cEluZGV4CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBhc3NlcnQgVHhuLmdyb3VwX2luZGV4ID09IDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEyMwogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfYXNzZXRbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBhc3NlcnQgYXNzZXQudG90YWwgPT0gMTIzCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaW50Y18zIC8vIDEyMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBUeG4uYXNzZXRzKDApID09IGFzc2V0CiAgICB0eG5hIEFzc2V0cyAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfYXBwW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aF9hcHA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMwogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjcKICAgIC8vIGFzc2VydCBhcHAuaWQgPT0gYXBwX2lkLCAiZXhwZWN0ZWQgYXBwIGlkIHRvIG1hdGNoIHByb3ZpZGVkIGFwcCBpZCIKICAgIGRpZyAxCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IGFwcC5jcmVhdG9yID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJleHBlY3RlZCBvdGhlciBhcHAgdG8gaGF2ZSBzYW1lIGNyZWF0b3IiCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvdGhlciBhcHAgdG8gaGF2ZSBzYW1lIGNyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBhcHBfdHhuID0gZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbigwKQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgZHVwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbnMoMCkgPT0gb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQKICAgIHR4bmEgQXBwbGljYXRpb25zIDAKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcHMoMSkgPT0gYXBwCiAgICBpbnRjXzAgLy8gMQogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbnMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbnMoMSkgPT0gYXBwCiAgICB0eG5hIEFwcGxpY2F0aW9ucyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfYWNjW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aF9hY2M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzcKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3OQogICAgLy8gYXNzZXJ0IGFjYy5iYWxhbmNlID09IGFjYy5taW5fYmFsYW5jZSArIDEyMzQKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgcHVzaGludCAxMjM0CiAgICArCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IFR4bi5hY2NvdW50cygwKSA9PSBUeG4uc2VuZGVyCiAgICB0eG5hIEFjY291bnRzIDAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDEpID09IGFjYwogICAgdHhuYSBBY2NvdW50cyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LmNvbXBsZXhfc2lnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29tcGxleF9zaWc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4NwogICAgLy8gZml2ZS52YWxpZGF0ZSgpCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODgKICAgIC8vIGFzc2VydCBUeG4ubnVtX2FwcF9hcmdzID09IDQKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4OS05MQogICAgLy8gIyBzdHJ1Y3QKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0Lm9uZSA9PSAxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBkdXAKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3QudHdvID09ICIyIgogICAgYnl0ZWNfMyAvLyAweDAwMDEzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICBkaWcgNgogICAgbGVuCiAgICBkaWcgNwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICBkdXAKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MwogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMudHdvID09ICIyIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLnRocmVlID09IDMKICAgIGRpZyA1CiAgICBleHRyYWN0IDQgMTYKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTUKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmZvdXIgPT0gNAogICAgZGlnIDUKICAgIGV4dHJhY3QgMjAgMTYKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTctOTgKICAgIC8vICMgdHhuCiAgICAvLyBhc3NlcnQgdHhuLmdyb3VwX2luZGV4ID09IFR4bi5ncm91cF9pbmRleCAtIDEKICAgIHVuY292ZXIgNAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIGFjYwogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpID09IGFyYzQuVUludDgoMSkuYnl0ZXMgICMgYWNjIGFycmF5IHJlZgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgcHVzaGJ5dGVzIDB4MDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IGFjYy5iYWxhbmNlID09IGFjYy5taW5fYmFsYW5jZSArIDEyMzQKICAgIGRpZyAzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgdW5jb3ZlciA0CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgcHVzaGludCAxMjM0CiAgICArCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDMKICAgIC8vIGFzc2VydCBmaXZlWzBdID09IDUKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAyIDEKICAgIHB1c2hieXRlcyAweDA1CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGludCA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X2luZGV4W3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV9pbmRleDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2V0X2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTQKICAgIC8vIGFzc2VydCBhc3NldCA9PSBUeG4uYXNzZXRzKGFzc2V0X2lkeCksICJleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBc3NldHMKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSBpbmRleAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE1CiAgICAvLyBhcHBfaWR4ID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygyKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IGFwcCA9PSBUeG4uYXBwbGljYXRpb25zKGFwcF9pZHgpLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHBsaWNhdGlvbiB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYWNjX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBhY2MgPT0gVHhuLmFjY291bnRzKGFjY19pZHgpLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBY2NvdW50cwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LmVjaG9fcmVzb3VyY2VfYnlfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgplY2hvX3Jlc291cmNlX2J5X3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxLTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIHJlc291cmNlX2VuY29kaW5nPSJ2YWx1ZSIsCiAgICAvLyApCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjcKICAgIC8vIGFjYy52YWxpZGF0ZSgpCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjgKICAgIC8vIGFzc2V0X2lkID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gYXNzZXJ0IGFzc2V0LmlkID09IGFzc2V0X2lkLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzAKICAgIC8vIGFwcF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzEKICAgIC8vIGFzc2VydCBhcHAuaWQgPT0gYXBwX2lkLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCBhY2MuYnl0ZXMgPT0gYWRkcmVzcywgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFkZHJlc3MgPSBUeG4uYXBwbGljYXRpb25fYXJncygzKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyMS0xMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkE4Yki2AQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADUAQQBoAIgAzgD9AdcCFgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNDNhoCNhoBKBNEKBNDNhoBMRYiCUk4ECISRDYaAk8CKBNEKBNESTgWFEQxFiISRDgIJRJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkM2GgE2GgIXwDI2GgM2GgRPAygTRCgTREsBFqhESXIHRDIJEkQjOBAkEkQjScIyMggSRDYyADIIEkQjIsIySwESRDYyARJDNhoBNhoCF8AcNhoDTwIoE0QoE0RJcwBESwFzAUSB0gkIEkQ2HAAxABJENhwBEkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==", + "approval": "CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkE4Yki2AQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal +++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal index bd404c15..10525e0d 100644 --- a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal +++ b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal @@ -19,7 +19,7 @@ main_opt_in_dummy_asset_route@3: ! txn ApplicationID && - assert // OnCompletion must be NoOp && can only call when not creating + assert b opt_in_dummy_asset main___algopy_default_create@5: @@ -28,8 +28,6 @@ main___algopy_default_create@5: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return @@ -56,7 +54,7 @@ opt_in_dummy_asset: // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum - pushint 0 // 0 + pushint 0 itxn_field Fee // tests/artifacts/Arc4InnerTxns/contract.py:7-11 // # Submit opt-in transaction: 0 asset transfer to self @@ -67,5 +65,5 @@ opt_in_dummy_asset: itxn_submit // tests/artifacts/Arc4InnerTxns/contract.py:5 // @arc4.abimethod - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json index 769231f5..526f5f88 100644 --- a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json +++ b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json @@ -59,20 +59,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 37 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 26 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when not creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -81,19 +68,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBvcHRfaW5fZHVtbXlfYXNzZXQKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRJbm5lclR4bnMuY29udHJhY3QuQXJjNElubmVyVHhuc0NvbnRyYWN0Lm9wdF9pbl9kdW1teV9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbl9kdW1teV9hc3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny0xMQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo5CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjctOAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCAwIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEFyYzRJbm5lclR4bnNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4YWIzOWM1NWEgLy8gbWV0aG9kICJvcHRfaW5fZHVtbXlfYXNzZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9kdW1teV9hc3NldF9yb3V0ZUAzCiAgICBlcnIKCm1haW5fb3B0X2luX2R1bW15X2Fzc2V0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbl9kdW1teV9hc3NldAoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNElubmVyVHhucy5jb250cmFjdC5BcmM0SW5uZXJUeG5zQ29udHJhY3Qub3B0X2luX2R1bW15X2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX2R1bW15X2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0SW5uZXJUeG5zL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRJbm5lclR4bnMvY29udHJhY3QucHk6Ny04CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo3LTExCiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNElubmVyVHhucy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==", + "approval": "CzEbQQAYgASrOcVaNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEM2GgEXsTIKshSyEYEEshCBALIBs4EBQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal +++ b/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal index 21d903e7..a9f44c60 100644 --- a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal +++ b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@57 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x96f14116 0xed666096 0x2ca0352b 0x85907d40 0x2cbec45b 0x07666fd9 0x370babd3 0x2b6b3ef0 0x339da97c 0x7898ed97 0x1f130cec 0xc748664e 0x7a460cb1 0xdcab1f01 0x97d9064d 0xce06c2a0 0xdcdbcee0 0x77a4b68d 0x4f540626 0x095aed41 0xe3b7e918 0x55337008 0x9bb1cd66 0x81484d9d 0x9a03df10 0xd3f0e44b 0x982db233 0xaffbdf0e 0x288af76e 0x8bd84a04 0x302b8a0a 0x337ae20b 0x6e259270 0x79e35f77 0x0f1574fe 0xb2cb13be 0xd059eea7 0x4cc4c157 0x3d17ac6e 0xf7f3d5fc 0xf8c8f8d5 0x43f7162a 0x42e09075 0xd956f575 0x6c0160df 0xa890150b 0x0b2f4c3f 0x9db9d327 0xe4d950a1 0xb605e80c // method "verify_uintn_uintn_eq(byte[],byte[])bool", method "verify_biguintn_uintn_eq(byte[],byte[])bool", method "verify_uintn_biguintn_eq(byte[],byte[])bool", method "verify_biguintn_biguintn_eq(byte[],byte[])bool", method "verify_uintn_uintn_ne(byte[],byte[])bool", method "verify_biguintn_uintn_ne(byte[],byte[])bool", method "verify_uintn_biguintn_ne(byte[],byte[])bool", method "verify_biguintn_biguintn_ne(byte[],byte[])bool", method "verify_uintn_uintn_lt(byte[],byte[])bool", method "verify_biguintn_uintn_lt(byte[],byte[])bool", method "verify_uintn_biguintn_lt(byte[],byte[])bool", method "verify_biguintn_biguintn_lt(byte[],byte[])bool", method "verify_uintn_uintn_le(byte[],byte[])bool", method "verify_biguintn_uintn_le(byte[],byte[])bool", method "verify_uintn_biguintn_le(byte[],byte[])bool", method "verify_biguintn_biguintn_le(byte[],byte[])bool", method "verify_uintn_uintn_gt(byte[],byte[])bool", method "verify_biguintn_uintn_gt(byte[],byte[])bool", method "verify_uintn_biguintn_gt(byte[],byte[])bool", method "verify_biguintn_biguintn_gt(byte[],byte[])bool", method "verify_uintn_uintn_ge(byte[],byte[])bool", method "verify_biguintn_uintn_ge(byte[],byte[])bool", method "verify_uintn_biguintn_ge(byte[],byte[])bool", method "verify_biguintn_biguintn_ge(byte[],byte[])bool", method "verify_uintn_init(byte[])uint32", method "verify_biguintn_init(byte[])uint256", method "verify_uintn_from_bytes(byte[])uint32", method "verify_biguintn_from_bytes(byte[])uint256", method "verify_uintn_from_log(byte[])uint32", method "verify_biguintn_from_log(byte[])uint256", method "verify_biguintn_as_uint64(byte[])uint64", method "verify_biguintn_as_biguint(byte[])uint512", method "verify_uintn64_as_uint64(byte[])uint64", method "verify_uintn64_as_biguint(byte[])uint512", method "verify_ufixednxm_bytes(ufixed32x8)byte[]", method "verify_bigufixednxm_bytes(ufixed256x16)byte[]", method "verify_ufixednxm_from_bytes(byte[])ufixed32x8", method "verify_bigufixednxm_from_bytes(byte[])ufixed256x16", method "verify_ufixednxm_from_log(byte[])ufixed32x8", method "verify_bigufixednxm_from_log(byte[])ufixed256x16", method "verify_string_init(string)string", method "verify_string_add(string,string)string", method "verify_string_eq(string,string)bool", method "verify_string_bytes(string)byte[]", method "verify_string_from_bytes(byte[])string", method "verify_string_from_log(byte[])string", method "verify_bool_bytes(bool)byte[]", method "verify_bool_from_bytes(byte[])bool", method "verify_bool_from_log(byte[])bool", method "verify_emit(string,uint512,uint64,byte[],uint64,bool,byte[],string,uint64,uint256,ufixed32x8,ufixed256x16,bool,byte[],byte[],byte[])void" @@ -25,8 +25,6 @@ main___algopy_default_create@57: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -1060,10 +1058,10 @@ verify_uintn_init: // return arc4.UInt32(a_biguint) dup len - pushint 4 // 4 + pushint 4 <= assert // overflow - pushint 4 // 4 + pushint 4 bzero b| // tests/artifacts/Arc4PrimitiveOps/contract.py:151 @@ -1086,10 +1084,10 @@ verify_biguintn_init: // return arc4.UInt256(a_biguint) dup len - pushint 32 // 32 + pushint 32 <= assert // overflow - pushint 32 // 32 + pushint 32 bzero b| // tests/artifacts/Arc4PrimitiveOps/contract.py:156 @@ -1188,10 +1186,10 @@ verify_biguintn_as_uint64: // return arc4.UInt256(a_biguint).as_uint64() dup len - pushint 32 // 32 + pushint 32 <= assert // overflow - pushint 32 // 32 + pushint 32 bzero b| dup @@ -1225,10 +1223,10 @@ verify_biguintn_as_biguint: // return arc4.UInt256(a_biguint).as_biguint() dup len - pushint 32 // 32 + pushint 32 <= assert // overflow - pushint 32 // 32 + pushint 32 bzero b| // tests/artifacts/Arc4PrimitiveOps/contract.py:182 @@ -1637,13 +1635,13 @@ verify_emit: intc_3 // 0 extract_uint16 dig 1 - pushint 2 // 2 + pushint 2 extract_uint16 substring3 extract 2 0 txna ApplicationArgs 15 dup - pushint 2 // 2 + pushint 2 extract_uint16 dig 1 len @@ -1666,7 +1664,7 @@ verify_emit: concat dig 2 len - pushint 84 // 84 + pushint 84 dig 1 + itob @@ -1704,7 +1702,7 @@ verify_emit: // ) dig 16 len - pushint 173 // 173 + pushint 173 + pushbytes 0x00ad uncover 17 diff --git a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json index afabcf83..75eeb800 100644 --- a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json +++ b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json @@ -1362,92 +1362,80 @@ "sourceInfo": [ { "pc": [ - 24 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 393 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 1581, - 1601, - 1790, - 1810, - 1935, - 1984 + 1579, + 1599, + 1788, + 1808, + 1933, + 1982 ], "errorMessage": "application log value is not the result of an ABI return" }, { "pc": [ - 1857 + 1855 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 413, - 426, - 459, - 470, - 505, - 516, - 551, - 564, - 597, - 610, - 643, - 654, - 689, - 700, - 735, - 748, - 781, - 794, - 827, - 838, - 873, - 884, - 919, - 932, - 965, - 978, - 1011, - 1022, - 1057, - 1068, - 1103, - 1116, - 1149, - 1162, - 1195, - 1206, - 1241, - 1252, - 1287, - 1300, - 1333, - 1346, - 1379, - 1390, - 1425, - 1436, - 1471, - 1484, - 1511, - 1533, - 1619, - 1628, - 1652, - 1661, - 1681, - 1701, - 1709 + 411, + 424, + 457, + 468, + 503, + 514, + 549, + 562, + 595, + 608, + 641, + 652, + 687, + 698, + 733, + 746, + 779, + 792, + 825, + 836, + 871, + 882, + 917, + 930, + 963, + 976, + 1009, + 1020, + 1055, + 1066, + 1101, + 1114, + 1147, + 1160, + 1193, + 1204, + 1239, + 1250, + 1285, + 1298, + 1331, + 1344, + 1377, + 1388, + 1423, + 1434, + 1469, + 1482, + 1509, + 1531, + 1617, + 1626, + 1650, + 1659, + 1679, + 1699, + 1707 ], "errorMessage": "overflow" } @@ -1460,19 +1448,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OTZmMTQxMTYgMHhlZDY2NjA5NiAweDJjYTAzNTJiIDB4ODU5MDdkNDAgMHgyY2JlYzQ1YiAweDA3NjY2ZmQ5IDB4MzcwYmFiZDMgMHgyYjZiM2VmMCAweDMzOWRhOTdjIDB4Nzg5OGVkOTcgMHgxZjEzMGNlYyAweGM3NDg2NjRlIDB4N2E0NjBjYjEgMHhkY2FiMWYwMSAweDk3ZDkwNjRkIDB4Y2UwNmMyYTAgMHhkY2RiY2VlMCAweDc3YTRiNjhkIDB4NGY1NDA2MjYgMHgwOTVhZWQ0MSAweGUzYjdlOTE4IDB4NTUzMzcwMDggMHg5YmIxY2Q2NiAweDgxNDg0ZDlkIDB4OWEwM2RmMTAgMHhkM2YwZTQ0YiAweDk4MmRiMjMzIDB4YWZmYmRmMGUgMHgyODhhZjc2ZSAweDhiZDg0YTA0IDB4MzAyYjhhMGEgMHgzMzdhZTIwYiAweDZlMjU5MjcwIDB4NzllMzVmNzcgMHgwZjE1NzRmZSAweGIyY2IxM2JlIDB4ZDA1OWVlYTcgMHg0Y2M0YzE1NyAweDNkMTdhYzZlIDB4ZjdmM2Q1ZmMgMHhmOGM4ZjhkNSAweDQzZjcxNjJhIDB4NDJlMDkwNzUgMHhkOTU2ZjU3NSAweDZjMDE2MGRmIDB4YTg5MDE1MGIgMHgwYjJmNGMzZiAweDlkYjlkMzI3IDB4ZTRkOTUwYTEgMHhiNjA1ZTgwYyAvLyBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl91aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl91aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9iaWd1aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50bl9pbml0KGJ5dGVbXSl1aW50MzIiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9pbml0KGJ5dGVbXSl1aW50MjU2IiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyhieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fbG9nKGJ5dGVbXSl1aW50MzIiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZyhieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYXNfYmlndWludChieXRlW10pdWludDUxMiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fYnl0ZXModWZpeGVkMzJ4OClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fYnl0ZXModWZpeGVkMjU2eDE2KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQzMng4IiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMoYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZyhieXRlW10pdWZpeGVkMjU2eDE2IiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2luaXQoc3RyaW5nKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19hZGQoc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZXEoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2J5dGVzKHN0cmluZylieXRlW10iLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZnJvbV9ieXRlcyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fbG9nKGJ5dGVbXSlzdHJpbmciLCBtZXRob2QgInZlcmlmeV9ib29sX2J5dGVzKGJvb2wpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9mcm9tX2J5dGVzKGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9mcm9tX2xvZyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VtaXQoc3RyaW5nLHVpbnQ1MTIsdWludDY0LGJ5dGVbXSx1aW50NjQsYm9vbCxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsYnl0ZVtdLGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50bl91aW50bl9lcSB2ZXJpZnlfYmlndWludG5fdWludG5fZXEgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2VxIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfdWludG5fdWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lIHZlcmlmeV91aW50bl9iaWd1aW50bl9uZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUgdmVyaWZ5X3VpbnRuX3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl91aW50bl9sdCB2ZXJpZnlfdWludG5fYmlndWludG5fbHQgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV91aW50bl91aW50bl9sZSB2ZXJpZnlfYmlndWludG5fdWludG5fbGUgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2xlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfdWludG5fdWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0IHZlcmlmeV91aW50bl9iaWd1aW50bl9ndCB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QgdmVyaWZ5X3VpbnRuX3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl91aW50bl9nZSB2ZXJpZnlfdWludG5fYmlndWludG5fZ2UgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV91aW50bl9pbml0IHZlcmlmeV9iaWd1aW50bl9pbml0IHZlcmlmeV91aW50bl9mcm9tX2J5dGVzIHZlcmlmeV9iaWd1aW50bl9mcm9tX2J5dGVzIHZlcmlmeV91aW50bl9mcm9tX2xvZyB2ZXJpZnlfYmlndWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NCB2ZXJpZnlfYmlndWludG5fYXNfYmlndWludCB2ZXJpZnlfdWludG42NF9hc191aW50NjQgdmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludCB2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzIHZlcmlmeV9iaWd1Zml4ZWRueG1fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2J5dGVzIHZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2cgdmVyaWZ5X3N0cmluZ19pbml0IHZlcmlmeV9zdHJpbmdfYWRkIHZlcmlmeV9zdHJpbmdfZXEgdmVyaWZ5X3N0cmluZ19ieXRlcyB2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2xvZyB2ZXJpZnlfYm9vbF9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2J5dGVzIHZlcmlmeV9ib29sX2Zyb21fbG9nIHZlcmlmeV9lbWl0CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA9PSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpICE9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpICE9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl91aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl91aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl91aW50bl9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl91aW50bl9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPD0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl91aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl91aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPiBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl91aW50bl9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl91aW50bl9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+PSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQzMihhX2JpZ3VpbnQpCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDMyLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDI1Ni5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYXNfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYXNfYmlndWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyByZXR1cm4gYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMzJdLCB0eXBpbmcuTGl0ZXJhbFs4XV0uZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJldHVybiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZyhTdHJpbmcoIkhlbGxvLCAiKSArIGEpCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGV4dHJhY3QgMiAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzAKICAgIC8vIHJldHVybiBhcmM0LkJvb2wuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gYXJjNC5lbWl0KFN3YXBwZWRBcmM0KG0sIG4sIG8sIHAsIHEsIGFyYzRfciwgYXJjNF9zLCBhcmM0X3QpKQogICAgZGlnIDcKICAgIGRpZyA3CiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwNTQKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGxlbgogICAgcHVzaGludCA4NCAvLyA4NAogICAgZGlnIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NjZiYjAzMzMgLy8gbWV0aG9kICJTd2FwcGVkQXJjNCh1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLHVpbnQ4WzNdLHVpbnQxNltdLCh1aW50MzIsdWludDY0LHN0cmluZykpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5Ny0zMTUKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZCIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBkaWcgMTYKICAgIGxlbgogICAgcHVzaGludCAxNzMgLy8gMTczCiAgICArCiAgICBwdXNoYnl0ZXMgMHgwMGFkCiAgICB1bmNvdmVyIDE3CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTYKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxNQogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgMTQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDEyCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxMQogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZWMzMzE5YmIgLy8gbWV0aG9kICJTd2FwcGVkKHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLHVpbnQ4WzNdLHVpbnQxNltdLCh1aW50MzIsdWludDY0LHN0cmluZykpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE2LTMzNAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgICJTd2FwcGVkKHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLHVpbnQ4WzNdLHVpbnQxNltdLCh1aW50MzIsdWludDY0LHN0cmluZykpIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYywKICAgIC8vICAgICBkLmNvcHkoKSwKICAgIC8vICAgICBlLAogICAgLy8gICAgIGYsCiAgICAvLyAgICAgZy5jb3B5KCksCiAgICAvLyAgICAgaCwKICAgIC8vICAgICBtLAogICAgLy8gICAgIG4sCiAgICAvLyAgICAgbywKICAgIC8vICAgICBwLAogICAgLy8gICAgIHEsCiAgICAvLyAgICAgYXJjNF9yLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3MuY29weSgpLAogICAgLy8gICAgIGFyYzRfdCwKICAgIC8vICkKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggNjQgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYKICAgIC8vIGNsYXNzIEFyYzRQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDk2ZjE0MTE2IDB4ZWQ2NjYwOTYgMHgyY2EwMzUyYiAweDg1OTA3ZDQwIDB4MmNiZWM0NWIgMHgwNzY2NmZkOSAweDM3MGJhYmQzIDB4MmI2YjNlZjAgMHgzMzlkYTk3YyAweDc4OThlZDk3IDB4MWYxMzBjZWMgMHhjNzQ4NjY0ZSAweDdhNDYwY2IxIDB4ZGNhYjFmMDEgMHg5N2Q5MDY0ZCAweGNlMDZjMmEwIDB4ZGNkYmNlZTAgMHg3N2E0YjY4ZCAweDRmNTQwNjI2IDB4MDk1YWVkNDEgMHhlM2I3ZTkxOCAweDU1MzM3MDA4IDB4OWJiMWNkNjYgMHg4MTQ4NGQ5ZCAweDlhMDNkZjEwIDB4ZDNmMGU0NGIgMHg5ODJkYjIzMyAweGFmZmJkZjBlIDB4Mjg4YWY3NmUgMHg4YmQ4NGEwNCAweDMwMmI4YTBhIDB4MzM3YWUyMGIgMHg2ZTI1OTI3MCAweDc5ZTM1Zjc3IDB4MGYxNTc0ZmUgMHhiMmNiMTNiZSAweGQwNTllZWE3IDB4NGNjNGMxNTcgMHgzZDE3YWM2ZSAweGY3ZjNkNWZjIDB4ZjhjOGY4ZDUgMHg0M2Y3MTYyYSAweDQyZTA5MDc1IDB4ZDk1NmY1NzUgMHg2YzAxNjBkZiAweGE4OTAxNTBiIDB4MGIyZjRjM2YgMHg5ZGI5ZDMyNyAweGU0ZDk1MGExIDB4YjYwNWU4MGMgLy8gbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fdWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludG5faW5pdChieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5faW5pdChieXRlW10pdWludDI1NiIsIG1ldGhvZCAidmVyaWZ5X3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQzMiIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXMoYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV91aW50bl9mcm9tX2xvZyhieXRlW10pdWludDMyIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludG5fZnJvbV9sb2coYnl0ZVtdKXVpbnQyNTYiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50bl9hc191aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQoYnl0ZVtdKXVpbnQ1MTIiLCBtZXRob2QgInZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludG42NF9hc19iaWd1aW50KGJ5dGVbXSl1aW50NTEyIiwgbWV0aG9kICJ2ZXJpZnlfdWZpeGVkbnhtX2J5dGVzKHVmaXhlZDMyeDgpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzKHVmaXhlZDI1NngxNilieXRlW10iLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyhieXRlW10pdWZpeGVkMzJ4OCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2J5dGVzKGJ5dGVbXSl1Zml4ZWQyNTZ4MTYiLCBtZXRob2QgInZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDMyeDgiLCBtZXRob2QgInZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2coYnl0ZVtdKXVmaXhlZDI1NngxNiIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfYWRkKHN0cmluZyxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2VxKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19ieXRlcyhzdHJpbmcpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXMoYnl0ZVtdKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19mcm9tX2xvZyhieXRlW10pc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZnlfYm9vbF9ieXRlcyhib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyhieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2Jvb2xfZnJvbV9sb2coYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lbWl0KHN0cmluZyx1aW50NTEyLHVpbnQ2NCxieXRlW10sdWludDY0LGJvb2wsYnl0ZVtdLHN0cmluZyx1aW50NjQsdWludDI1Nix1Zml4ZWQzMng4LHVmaXhlZDI1NngxNixib29sLGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludG5fdWludG5fZXEgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2VxIHZlcmlmeV91aW50bl9iaWd1aW50bl9lcSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fZXEgdmVyaWZ5X3VpbnRuX3VpbnRuX25lIHZlcmlmeV9iaWd1aW50bl91aW50bl9uZSB2ZXJpZnlfdWludG5fYmlndWludG5fbmUgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lIHZlcmlmeV91aW50bl91aW50bl9sdCB2ZXJpZnlfYmlndWludG5fdWludG5fbHQgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2x0IHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9sdCB2ZXJpZnlfdWludG5fdWludG5fbGUgdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2xlIHZlcmlmeV91aW50bl9iaWd1aW50bl9sZSB2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGUgdmVyaWZ5X3VpbnRuX3VpbnRuX2d0IHZlcmlmeV9iaWd1aW50bl91aW50bl9ndCB2ZXJpZnlfdWludG5fYmlndWludG5fZ3QgdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX2d0IHZlcmlmeV91aW50bl91aW50bl9nZSB2ZXJpZnlfYmlndWludG5fdWludG5fZ2UgdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX2dlIHZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9nZSB2ZXJpZnlfdWludG5faW5pdCB2ZXJpZnlfYmlndWludG5faW5pdCB2ZXJpZnlfdWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlcyB2ZXJpZnlfdWludG5fZnJvbV9sb2cgdmVyaWZ5X2JpZ3VpbnRuX2Zyb21fbG9nIHZlcmlmeV9iaWd1aW50bl9hc191aW50NjQgdmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnQgdmVyaWZ5X3VpbnRuNjRfYXNfdWludDY0IHZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQgdmVyaWZ5X3VmaXhlZG54bV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzIHZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlcyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fYnl0ZXMgdmVyaWZ5X3VmaXhlZG54bV9mcm9tX2xvZyB2ZXJpZnlfYmlndWZpeGVkbnhtX2Zyb21fbG9nIHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX2FkZCB2ZXJpZnlfc3RyaW5nX2VxIHZlcmlmeV9zdHJpbmdfYnl0ZXMgdmVyaWZ5X3N0cmluZ19mcm9tX2J5dGVzIHZlcmlmeV9zdHJpbmdfZnJvbV9sb2cgdmVyaWZ5X2Jvb2xfYnl0ZXMgdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlcyB2ZXJpZnlfYm9vbF9mcm9tX2xvZyB2ZXJpZnlfZW1pdAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl91aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl91aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9iaWd1aW50bl9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID09IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSAhPSBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2JpZ3VpbnRuX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgIT0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDwgYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPCBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPCBhcmM0LlVJbnQ1MTIoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA8PSBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpIDw9IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NTEyKGFfYmlndWludCkgPD0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPiBhcmM0LlVJbnQ2NChiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBifAogICAgZGlnIDIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX3VpbnRuX2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ1MTIoYV9iaWd1aW50KSA+IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9iaWd1aW50bl9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9iaWd1aW50bl9ndDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KSA+IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID4gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgY292ZXIgMgogICAgYnwKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NjQoYl9iaWd1aW50KQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgYnwKICAgIGRpZyAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBjb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fdWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fdWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDY0KGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGFfYmlndWludCkgPj0gYXJjNC5VSW50NTEyKGJfYmlndWludCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gOAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgYnwKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBifAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMyAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYmlndWludG5fZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDUxMihhX2JpZ3VpbnQpID49IGFyYzQuVUludDUxMihiX2JpZ3VpbnQpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGJ8CiAgICBkaWcgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGNvdmVyIDIKICAgIGJ8CiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18zIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnRuX2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50MzIoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA0CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5faW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludG5fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDMyLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50bl9mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDI1Ni5mcm9tX2xvZyhhKQogICAgZHVwCiAgICBleHRyYWN0IDYgMAogICAgc3dhcAogICAgZXh0cmFjdCAyIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBsb2cgdmFsdWUgaXMgbm90IHRoZSByZXN1bHQgb2YgYW4gQUJJIHJldHVybgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludG5fYXNfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRuX2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc191aW50NjQoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRuX2FzX2JpZ3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludG5fYXNfYmlndWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQyNTYoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIGJ8CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhX2JpZ3VpbnQpLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyA4CiAgICBiemVybwogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnRuNjRfYXNfYmlndWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50bjY0X2FzX2JpZ3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYV9iaWd1aW50KS5hc19iaWd1aW50KCkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDgKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgYnwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VmaXhlZG54bV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWZpeGVkbnhtX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VmaXhlZG54bV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91Zml4ZWRueG1fZnJvbV9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWZpeGVkbnhtX2Zyb21fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI1CiAgICAvLyByZXR1cm4gYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbMzJdLCB0eXBpbmcuTGl0ZXJhbFs4XV0uZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VmaXhlZG54bV9mcm9tX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1Zml4ZWRueG1fZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJldHVybiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZyhTdHJpbmcoIkhlbGxvLCAiKSArIGEpCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGV4dHJhY3QgMiAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzMgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2Zyb21fYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19mcm9tX2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nLmZyb21fbG9nKGEpCiAgICBkdXAKICAgIGV4dHJhY3QgNiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0UHJpbWl0aXZlT3BzLmNvbnRyYWN0LkFyYzRQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYm9vbF9mcm9tX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRQcmltaXRpdmVPcHMuY29udHJhY3QuQXJjNFByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ib29sX2Zyb21fbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jvb2xfZnJvbV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNFByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzAKICAgIC8vIHJldHVybiBhcmM0LkJvb2wuZnJvbV9sb2coYSkKICAgIGR1cAogICAgZXh0cmFjdCA2IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMiA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNFByaW1pdGl2ZU9wcy5jb250cmFjdC5BcmM0UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2VtaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZW1pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZEFyYzQobSwgbiwgbywgcCwgcSwgYXJjNF9yLCBhcmM0X3MsIGFyYzRfdCkpCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA1NAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDg0CiAgICBkaWcgMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg2NmJiMDMzMyAvLyBtZXRob2QgIlN3YXBwZWRBcmM0KHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJvb2wsdWludDhbM10sdWludDE2W10sKHVpbnQzMix1aW50NjQsc3RyaW5nKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRQcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk3LTMxNQogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgICJTd2FwcGVkIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYywKICAgIC8vICAgICBkLmNvcHkoKSwKICAgIC8vICAgICBlLAogICAgLy8gICAgIGYsCiAgICAvLyAgICAgZy5jb3B5KCksCiAgICAvLyAgICAgaCwKICAgIC8vICAgICBtLAogICAgLy8gICAgIG4sCiAgICAvLyAgICAgbywKICAgIC8vICAgICBwLAogICAgLy8gICAgIHEsCiAgICAvLyAgICAgYXJjNF9yLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3MuY29weSgpLAogICAgLy8gICAgIGFyYzRfdCwKICAgIC8vICkKICAgIGRpZyAxNgogICAgbGVuCiAgICBwdXNoaW50IDE3MwogICAgKwogICAgcHVzaGJ5dGVzIDB4MDBhZAogICAgdW5jb3ZlciAxNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDE2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGVjMzMxOWJiIC8vIG1ldGhvZCAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNi0zMzQKICAgIC8vIGFyYzQuZW1pdCgKICAgIC8vICAgICAiU3dhcHBlZChzdHJpbmcsdWludDUxMix1aW50NjQsYnl0ZVtdLHVpbnQ2NCxib29sLGJ5dGVbXSxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYm9vbCx1aW50OFszXSx1aW50MTZbXSwodWludDMyLHVpbnQ2NCxzdHJpbmcpKSIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGMsCiAgICAvLyAgICAgZC5jb3B5KCksCiAgICAvLyAgICAgZSwKICAgIC8vICAgICBmLAogICAgLy8gICAgIGcuY29weSgpLAogICAgLy8gICAgIGgsCiAgICAvLyAgICAgbSwKICAgIC8vICAgICBuLAogICAgLy8gICAgIG8sCiAgICAvLyAgICAgcCwKICAgIC8vICAgICBxLAogICAgLy8gICAgIGFyYzRfci5jb3B5KCksCiAgICAvLyAgICAgYXJjNF9zLmNvcHkoKSwKICAgIC8vICAgICBhcmM0X3QsCiAgICAvLyApCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0UHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAsAOQBnAJUAwwDxAR8BTQF7AakB1wIFAjMCYQKPAr0C6wMZA0cDdQOjA9ED/wQtBFsEcQSHBJMEnwSzBMcE6AUGBRoFNgVHBVgFZAVwBYQFmAW3BdIF5AX1BgEGFQYmBjIGRgAxGRQxGBQQRCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpyklTwJUKExQsCJDNhoBVwIASRWBBA5EgQSvqyhMULAiQzYaAVcCAEkVgSAORIEgr6soTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIASRWBIA5EgSCvq0mTJA5ESRUjCSNYKExQsCJDNhoBVwIASRWBIA5EgSCvq0kVJA5EJK+rKExQsCJDNhoBVwIASRUjDkQjr6soTFCwIkM2GgFXAgBJFSMORCOvq0kVJA5EJK+rKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFXAgCAB0hlbGxvLCBMUEkVFlcGAkxQKExQsCJDNhoBNhoCVwIAUElXAgAVFlcGAlwAKExQsCJDNhoBNhoCEiklTwJUKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgE2GgI2GgM2GgQ2GgU2GgY2Ggc2Ggg2Ggk2Ggo2Ggs2Ggw2Gg02Gg5XAgA2Gg9JJVlLAYECWVJXAgA2Gg9JgQJZSwEVUlcCAEsHSwdQSwZQSwVQSwRQSwNQgAIAVFBLAhWBVEsBCBZXBgJPAkxQSwNQSwJQgARmuwMzTFCwSxAVga0BCIACAK1PEVBPEFBLARZXBgJQSw8VTwIITE8OUE8NUEsBFlcGAlBLDBVPAghJFlcGAk8CTFBLCxVPAghMTwpQTwlQTwhQTwdQTwZQTwVQSwEWVwYCUExPAggWVwYCUE8GUE8FUE8EUE8DUE8CUExQgATsMxm7TFBJsLAiQw==", + "approval": "CyAEAQhAACYCBBUffHUBADEbQQFtMRkURDEYRIIyBJbxQRYE7WZglgQsoDUrBIWQfUAELL7EWwQHZm/ZBDcLq9MEK2s+8AQznal8BHiY7ZcEHxMM7ATHSGZOBHpGDLEE3KsfAQSX2QZNBM4GwqAE3NvO4AR3pLaNBE9UBiYECVrtQQTjt+kYBFUzcAgEm7HNZgSBSE2dBJoD3xAE0/DkSwSYLbIzBK/73w4EKIr3bgSL2EoEBDArigoEM3riCwRuJZJwBHnjX3cEDxV0/gSyyxO+BNBZ7qcETMTBVwQ9F6xuBPfz1fwE+Mj41QRD9xYqBELgkHUE2Vb1dQRsAWDfBKiQFQsECy9MPwSdudMnBOTZUKEEtgXoDDYaAI4yAAkANwBlAJMAwQDvAR0BSwF5AacB1QIDAjECXwKNArsC6QMXA0UDcwOhA88D/QQrBFkEbwSFBJEEnQSxBMUE5gUEBRgFNAVFBVYFYgVuBYIFlgW1BdAF4gXzBf8GEwYkBjAGRAAxGRQxGBQQQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrqCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6gpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAquoKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6kpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqupKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrqSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqukKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpCklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6QpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwJLAatLAhUjDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08Cq0sBFSMORCOvTwKrpiklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAqtLARUkDkQkr08Cq6YpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwJLAatLAhUkDkROAqumKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08CSwGrSwIVIw5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAqtLARUjDkQjr08Cq6UpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSMORCOvTwKrSwEVJA5EJK9PAqulKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUkDkQkr08CSwGrSwIVJA5ETgKrpSklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVIw5EI69PAksBq0sCFSMORE4Cq6cpJU8CVChMULAiQzYaAVcCADYaAlcCAEsBFSQORCSvTwKrSwEVIw5EI69PAqunKSVPAlQoTFCwIkM2GgFXAgA2GgJXAgBLARUjDkQjr08Cq0sBFSQORCSvTwKrpyklTwJUKExQsCJDNhoBVwIANhoCVwIASwEVJA5EJK9PAksBq0sCFSQORE4Cq6cpJU8CVChMULAiQzYaAVcCAEkVgQQORIEEr6soTFCwIkM2GgFXAgBJFYEgDkSBIK+rKExQsCJDNhoBVwIAKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAVcCAEkVgSAORIEgr6tJkyQOREkVIwkjWChMULAiQzYaAVcCAEkVgSAORIEgr6tJFSQORCSvqyhMULAiQzYaAVcCAEkVIw5EI6+rKExQsCJDNhoBVwIASRUjDkQjr6tJFSQORCSvqyhMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBSRUWVwYCTFAoTFCwIkM2GgFXAgAoTFCwIkM2GgFXAgAoTFCwIkM2GgFJVwYATFcCBCgSRChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaATYaAlcCAFBJVwIAFRZXBgJcAChMULAiQzYaATYaAhIpJU8CVChMULAiQzYaAUkVFlcGAkxQKExQsCJDNhoBVwIAKExQsCJDNhoBSVcGAExXAgQoEkQoTFCwIkM2GgFJFRZXBgJMUChMULAiQzYaAVcCAChMULAiQzYaAUlXBgBMVwIEKBJEKExQsCJDNhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoOVwIANhoPSSVZSwGBAllSVwIANhoPSYECWUsBFVJXAgBLB0sHUEsGUEsFUEsEUEsDUIACAFRQSwIVgVRLAQgWVwYCTwJMUEsDUEsCUIAEZrsDM0xQsEsQFYGtAQiAAgCtTxFQTxBQSwEWVwYCUEsPFU8CCExPDlBPDVBLARZXBgJQSwwVTwIISRZXBgJPAkxQSwsVTwIITE8KUE8JUE8IUE8HUE8GUE8FUEsBFlcGAlBMTwIIFlcGAlBPBlBPBVBPBFBPA1BPAlBMUIAE7DMZu0xQSbCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [ diff --git a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal +++ b/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arrays/data/Contract.approval.teal b/tests/artifacts/Arrays/data/Contract.approval.teal index 0a6a936c..8403da66 100644 --- a/tests/artifacts/Arrays/data/Contract.approval.teal +++ b/tests/artifacts/Arrays/data/Contract.approval.teal @@ -3,8 +3,8 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: - intcblock 8 1 0 5 512 - bytecblock 0x 0x000000000000000100000000000000020000000000000003 0x0000000000000000 0x0000000000000004 + intcblock 1 8 0 5 512 + bytecblock 0x 0x0000000000000000 0x0000000000000004 pushbytes 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff store 0 // tests/artifacts/Arrays/uint64.py:13 @@ -13,7 +13,7 @@ main: bz main___algopy_default_create@19 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xa33be873 0xe0c378e9 0x366f509d 0x58351a50 0xfa99e984 0xa20e440f 0x179ac3f9 0x45dcc836 0xf17f6f0a 0x845e1b4e 0x7621cfd1 0x5661a67c // method "test_array()void", method "test_array_extend()void", method "test_array_multiple_append()void", method "overhead()void", method "test_array_too_long()void", method "test_array_copy_and_extend()void", method "test_array_evaluation_order()void", method "test_array_assignment_maximum_cursage()void", method "test_allocations(uint64)void", method "test_iteration()void", method "test_quicksort()void", method "test_unobserved_write()void" @@ -24,7 +24,7 @@ main: main_overhead_route@7: // tests/artifacts/Arrays/uint64.py:71 // @arc4.abimethod() - intc_1 // 1 + intc_0 // 1 return main___algopy_default_create@19: @@ -33,8 +33,6 @@ main___algopy_default_create@19: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_1 // 1 return @@ -53,12 +51,12 @@ quicksort_window: frame_dig -2 frame_dig -1 + - pushint 2 // 2 + pushint 2 / frame_dig -3 loads swap - intc_0 // 8 + intc_1 // 8 * extract_uint64 frame_dig -1 @@ -71,7 +69,7 @@ quicksort_window_while_top@3: frame_dig -3 loads frame_dig 4 - intc_0 // 8 + intc_1 // 8 * dup frame_bury 0 @@ -82,7 +80,7 @@ quicksort_window_while_top@3: // tests/artifacts/Arrays/uint64.py:213 // left += 1 frame_dig 4 - intc_1 // 1 + intc_0 // 1 + frame_bury 4 b quicksort_window_while_top@3 @@ -94,7 +92,7 @@ quicksort_window_while_top@6: frame_dig -3 loads frame_dig 3 - intc_0 // 8 + intc_1 // 8 * dup frame_bury 1 @@ -110,7 +108,7 @@ quicksort_window_while_top@6: // tests/artifacts/Arrays/uint64.py:219 // right -= 1 frame_dig 3 - intc_1 // 1 + intc_0 // 1 - frame_bury 3 b quicksort_window_while_top@6 @@ -164,13 +162,13 @@ quicksort_window_after_while@10: frame_dig 1 dup cover 3 - intc_0 // 8 + intc_1 // 8 extract3 // on error: index access is out of bounds dig 1 frame_dig 0 dup cover 3 - intc_0 // 8 + intc_1 // 8 extract3 // on error: index access is out of bounds cover 3 replace3 // on error: index access is out of bounds @@ -182,7 +180,7 @@ quicksort_window_after_while@10: // tests/artifacts/Arrays/uint64.py:224 // left += 1 frame_dig 4 - intc_1 // 1 + intc_0 // 1 + frame_bury 4 // tests/artifacts/Arrays/uint64.py:225-226 @@ -193,7 +191,7 @@ quicksort_window_after_while@10: // tests/artifacts/Arrays/uint64.py:228 // right -= 1 frame_dig 3 - intc_1 // 1 + intc_0 // 1 - dup frame_bury 3 @@ -216,7 +214,7 @@ quicksort_window_after_if_else@16: // tests/artifacts/Arrays/uint64.py:237 // left += 1 frame_dig 4 - intc_1 // 1 + intc_0 // 1 + frame_bury 4 // tests/artifacts/Arrays/uint64.py:238-239 @@ -227,7 +225,7 @@ quicksort_window_after_if_else@16: // tests/artifacts/Arrays/uint64.py:240 // right -= 1 frame_dig 3 - intc_1 // 1 + intc_0 // 1 - frame_bury 3 b quicksort_window_after_while@22 @@ -269,7 +267,7 @@ create_array_for_header@1: stores // tests/artifacts/Arrays/uint64.py:258 // for i in urange(5): - intc_1 // 1 + intc_0 // 1 + frame_bury 1 b create_array_for_header@1 @@ -292,11 +290,11 @@ assert_last_is_zero: loads dup len - intc_0 // 8 + intc_1 // 8 / - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * extract_uint64 ! @@ -335,7 +333,7 @@ add_x_for_header@1: stores // tests/artifacts/Arrays/uint64.py:279 // for i in urange(x): - intc_1 // 1 + intc_0 // 1 + frame_bury 0 b add_x_for_header@1 @@ -356,7 +354,7 @@ append_length_and_return: loads dup len - intc_0 // 8 + intc_1 // 8 / itob concat // on error: max array length exceeded @@ -377,7 +375,7 @@ test_array: dup // tests/artifacts/Arrays/uint64.py:19 // arr.append(UInt64(42)) - pushint 42 // 42 + pushint 42 itob dig 1 swap @@ -392,25 +390,25 @@ test_array: loads dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 6 // 6 + pushint 6 == assert // tests/artifacts/Arrays/uint64.py:25 // assert arr[-1] == 4 - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * extract_uint64 - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arrays/uint64.py:27 // pop_x(arr, x=UInt64(3), expected=UInt64(4)) - pushint 4 // 4 + pushint 4 // tests/artifacts/Arrays/uint64.py:285 // for _i in urange(x): intc_2 // 0 @@ -421,7 +419,7 @@ test_array_for_header@2: dup // tests/artifacts/Arrays/uint64.py:27 // pop_x(arr, x=UInt64(3), expected=UInt64(4)) - pushint 3 // 3 + pushint 3 // tests/artifacts/Arrays/uint64.py:285 // for _i in urange(x): < @@ -434,7 +432,7 @@ test_array_for_header@2: dup len dup - intc_0 // 8 + intc_1 // 8 - dig 2 intc_2 // 0 @@ -456,13 +454,13 @@ test_array_for_header@2: assert // tests/artifacts/Arrays/uint64.py:288 // expected -= 1 - intc_1 // 1 + intc_0 // 1 - bury 2 // tests/artifacts/Arrays/uint64.py:285 // for _i in urange(x): dup - intc_1 // 1 + intc_0 // 1 + bury 1 b test_array_for_header@2 @@ -475,27 +473,27 @@ test_array_after_for@4: loads dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 3 // 3 + pushint 3 == assert // tests/artifacts/Arrays/uint64.py:29 // assert arr[-1] == 1 - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * dig 1 swap extract_uint64 - intc_1 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/uint64.py:31 // arr.append(UInt64(43)) - pushint 43 // 43 + pushint 43 itob concat // on error: max array length exceeded dup2 @@ -504,35 +502,35 @@ test_array_after_for@4: // assert arr.length == 4 dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arrays/uint64.py:33 // assert arr[-1] == 43 - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * dig 1 swap extract_uint64 - pushint 43 // 43 + pushint 43 == assert // tests/artifacts/Arrays/uint64.py:34 // assert arr[0] == 42 intc_2 // 0 extract_uint64 - pushint 42 // 42 + pushint 42 == assert // tests/artifacts/Arrays/uint64.py:36 // add_x(arr, UInt64(10)) dup - pushint 10 // 10 + pushint 10 callsub add_x // tests/artifacts/Arrays/uint64.py:37 // assert arr.length == 14 @@ -540,59 +538,59 @@ test_array_after_for@4: loads dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 14 // 14 + pushint 14 == assert // tests/artifacts/Arrays/uint64.py:38 // assert arr[-1] == 9 - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * dig 1 swap extract_uint64 - pushint 9 // 9 + pushint 9 == assert // tests/artifacts/Arrays/uint64.py:40 // arr.append(UInt64(44)) - pushint 44 // 44 + pushint 44 itob concat // on error: max array length exceeded // tests/artifacts/Arrays/uint64.py:41 // assert arr.length == 15 dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 15 // 15 + pushint 15 == assert // tests/artifacts/Arrays/uint64.py:42 // assert arr[-1] == 44 - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * dig 1 swap extract_uint64 - pushint 44 // 44 + pushint 44 == assert // tests/artifacts/Arrays/uint64.py:272 // arr.append(UInt64(99)) - pushint 99 // 99 + pushint 99 itob concat // on error: max array length exceeded // tests/artifacts/Arrays/uint64.py:273 // arr2.append(UInt64(100)) - pushint 100 // 100 + pushint 100 itob concat // on error: max array length exceeded // tests/artifacts/Arrays/uint64.py:44 @@ -600,7 +598,7 @@ test_array_after_for@4: dup intc_2 // 0 extract_uint64 - pushint 2 // 2 + pushint 2 + itob replace2 0 // on error: index access is out of bounds @@ -611,10 +609,10 @@ test_array_after_for@4: // assert arr.length == 17 dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 17 // 17 + pushint 17 == assert // tests/artifacts/Arrays/uint64.py:46 @@ -622,33 +620,35 @@ test_array_after_for@4: dig 1 intc_2 // 0 extract_uint64 - pushint 44 // 44 + pushint 44 == assert // tests/artifacts/Arrays/uint64.py:47 // assert arr[-2] == 99 dup - pushint 2 // 2 + pushint 2 - - intc_0 // 8 + intc_1 // 8 * dig 2 swap extract_uint64 - pushint 99 // 99 + pushint 99 == assert // tests/artifacts/Arrays/uint64.py:48 // assert arr[-1] == 100 - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * extract_uint64 - pushint 100 // 100 + pushint 100 == + assert // tests/artifacts/Arrays/uint64.py:14 // @arc4.abimethod() + intc_0 // 1 return @@ -663,19 +663,15 @@ test_array_extend: // tests/artifacts/Arrays/uint64.py:53 // add_x(arr, UInt64(1)) dup - intc_1 // 1 + intc_0 // 1 callsub add_x - // tests/artifacts/Arrays/uint64.py:57 - // arr2.append(UInt64(3)) - bytec_1 // 0x000000000000000100000000000000020000000000000003 - pop // tests/artifacts/Arrays/uint64.py:59 // arr.extend(arr2) dup loads // tests/artifacts/Arrays/uint64.py:57 // arr2.append(UInt64(3)) - bytec_1 // 0x000000000000000100000000000000020000000000000003 + pushbytes 0x000000000000000100000000000000020000000000000003 // tests/artifacts/Arrays/uint64.py:59 // arr.extend(arr2) concat // on error: max array length exceeded @@ -685,12 +681,14 @@ test_array_extend: // tests/artifacts/Arrays/uint64.py:60 // assert arr.length == 4 len - intc_0 // 8 + intc_1 // 8 / - pushint 4 // 4 + pushint 4 == + assert // tests/artifacts/Arrays/uint64.py:50 // @arc4.abimethod() + intc_0 // 1 return @@ -705,23 +703,23 @@ test_array_multiple_append: // tests/artifacts/Arrays/uint64.py:65 // add_x(arr, UInt64(1)) dup - intc_1 // 1 + intc_0 // 1 callsub add_x // tests/artifacts/Arrays/uint64.py:66 // arr.append(UInt64(1)) dup loads - intc_1 // 1 + intc_0 // 1 itob concat // on error: max array length exceeded // tests/artifacts/Arrays/uint64.py:67 // arr.append(UInt64(2)) - pushint 2 // 2 + pushint 2 itob concat // on error: max array length exceeded // tests/artifacts/Arrays/uint64.py:68 // arr.append(UInt64(3)) - pushint 3 // 3 + pushint 3 itob concat // on error: max array length exceeded swap @@ -730,12 +728,14 @@ test_array_multiple_append: // tests/artifacts/Arrays/uint64.py:69 // assert arr.length == 4 len - intc_0 // 8 + intc_1 // 8 / - pushint 4 // 4 + pushint 4 == + assert // tests/artifacts/Arrays/uint64.py:62 // @arc4.abimethod() + intc_0 // 1 return @@ -765,7 +765,7 @@ test_array_too_long_for_header@2: bury 3 // tests/artifacts/Arrays/uint64.py:78 // for i in urange(512): - intc_1 // 1 + intc_0 // 1 + bury 1 b test_array_too_long_for_header@2 @@ -776,7 +776,7 @@ test_array_too_long_after_for@5: // assert array.length == 512, "array is expected length" dup len - intc_0 // 8 + intc_1 // 8 / intc 4 // 512 == @@ -789,7 +789,7 @@ test_array_too_long_after_for@5: pop // tests/artifacts/Arrays/uint64.py:75 // @arc4.abimethod() - intc_1 // 1 + intc_0 // 1 return @@ -819,7 +819,7 @@ test_array_copy_and_extend_for_header@2: bury 3 // tests/artifacts/Arrays/uint64.py:87 // for i in urange(5): - intc_1 // 1 + intc_0 // 1 + bury 1 b test_array_copy_and_extend_for_header@2 @@ -836,17 +836,17 @@ test_array_copy_and_extend_after_for@5: // assert array.length == 6 dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 6 // 6 + pushint 6 == assert // tests/artifacts/Arrays/uint64.py:93 // assert array[-1] == 5, "expected 5" - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * dig 1 swap @@ -859,7 +859,7 @@ test_array_copy_and_extend_after_for@5: // assert array2.length == 5 dup len - intc_0 // 8 + intc_1 // 8 / dup intc_3 // 5 @@ -867,14 +867,14 @@ test_array_copy_and_extend_after_for@5: assert // tests/artifacts/Arrays/uint64.py:96 // assert array2[-1] == 4, "expected 4" - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * dig 1 swap extract_uint64 - pushint 4 // 4 + pushint 4 == assert // expected 4 // tests/artifacts/Arrays/uint64.py:98 @@ -884,58 +884,58 @@ test_array_copy_and_extend_after_for@5: // assert array.length == 11 dup len - intc_0 // 8 + intc_1 // 8 / dup - pushint 11 // 11 + pushint 11 == assert uncover 2 // tests/artifacts/Arrays/uint64.py:100 // assert array2.length == 5 len - intc_0 // 8 + intc_1 // 8 / intc_3 // 5 == assert // tests/artifacts/Arrays/uint64.py:101 // assert array[-1] == 4, "expected 4" - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * dig 1 swap extract_uint64 - pushint 4 // 4 + pushint 4 == assert // expected 4 // tests/artifacts/Arrays/uint64.py:102 // assert array[4] == 4, "expected 4" dup - pushint 32 // 32 + pushint 32 extract_uint64 - pushint 4 // 4 + pushint 4 == assert // expected 4 // tests/artifacts/Arrays/uint64.py:103 // assert array[5] == 5, "expected 4" dup - pushint 40 // 40 + pushint 40 extract_uint64 intc_3 // 5 == assert // expected 4 // tests/artifacts/Arrays/uint64.py:104 // assert array[6] == 0, "expected 4" - pushint 48 // 48 + pushint 48 extract_uint64 ! assert // expected 4 // tests/artifacts/Arrays/uint64.py:84 // @arc4.abimethod() - intc_1 // 1 + intc_0 // 1 return @@ -946,7 +946,7 @@ test_array_evaluation_order: callsub _puya_lib.mem.new_slot // tests/artifacts/Arrays/uint64.py:109 // arr.append(UInt64(3)) - pushint 3 // 3 + pushint 3 itob dig 1 swap @@ -969,9 +969,9 @@ test_array_evaluation_order: loads dup len - intc_0 // 8 + intc_1 // 8 / - pushint 6 // 6 + pushint 6 == assert // tests/artifacts/Arrays/uint64.py:112 @@ -979,46 +979,46 @@ test_array_evaluation_order: dup intc_2 // 0 extract_uint64 - pushint 3 // 3 + pushint 3 == assert // tests/artifacts/Arrays/uint64.py:113 // assert arr[1] == 1 dup - intc_0 // 8 + intc_1 // 8 extract_uint64 - intc_1 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/uint64.py:114 // assert arr[2] == 2 dup - pushint 16 // 16 + pushint 16 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/uint64.py:115 // assert arr[3] == 3 dup - pushint 24 // 24 + pushint 24 extract_uint64 - pushint 3 // 3 + pushint 3 == assert // tests/artifacts/Arrays/uint64.py:116 // assert arr[4] == 1 dup - pushint 32 // 32 + pushint 32 extract_uint64 - intc_1 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/uint64.py:117 // assert arr[5] == 2 - pushint 40 // 40 + pushint 40 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/uint64.py:119 @@ -1028,13 +1028,13 @@ test_array_evaluation_order: loads dup len - intc_0 // 8 + intc_1 // 8 / - intc_1 // 1 + intc_0 // 1 - - intc_0 // 8 + intc_1 // 8 * - intc_0 // 8 + intc_1 // 8 extract3 // on error: index access is out of bounds dig 1 callsub append_length_and_return @@ -1044,7 +1044,7 @@ test_array_evaluation_order: dig 2 loads swap - intc_0 // 8 + intc_1 // 8 * uncover 2 replace3 // on error: index access is out of bounds @@ -1055,35 +1055,37 @@ test_array_evaluation_order: // assert arr.length == 8 dup len - intc_0 // 8 + intc_1 // 8 / - intc_0 // 8 + intc_1 // 8 == assert // tests/artifacts/Arrays/uint64.py:121 // assert arr[6] == 6 dup - pushint 48 // 48 + pushint 48 extract_uint64 - pushint 6 // 6 + pushint 6 == assert // tests/artifacts/Arrays/uint64.py:122 // assert arr[7] == 7 dup - pushint 56 // 56 + pushint 56 extract_uint64 - pushint 7 // 7 + pushint 7 == assert // tests/artifacts/Arrays/uint64.py:123 // assert arr[3] == 6 - pushint 24 // 24 + pushint 24 extract_uint64 - pushint 6 // 6 + pushint 6 == + assert // tests/artifacts/Arrays/uint64.py:106 // @arc4.abimethod() + intc_0 // 1 return @@ -1094,7 +1096,7 @@ test_array_assignment_maximum_cursage: callsub _puya_lib.mem.new_slot // tests/artifacts/Arrays/uint64.py:128 // arr.append(UInt64(3)) - pushint 3 // 3 + pushint 3 itob dig 1 swap @@ -1103,7 +1105,7 @@ test_array_assignment_maximum_cursage: // append_length_and_return(arr)[0] = UInt64(42) dup callsub append_length_and_return - pushint 42 // 42 + pushint 42 itob dig 1 loads @@ -1115,9 +1117,9 @@ test_array_assignment_maximum_cursage: loads dup len - intc_0 // 8 + intc_1 // 8 / - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/uint64.py:131 @@ -1125,17 +1127,19 @@ test_array_assignment_maximum_cursage: dup intc_2 // 0 extract_uint64 - pushint 42 // 42 + pushint 42 == assert // tests/artifacts/Arrays/uint64.py:132 // assert arr[1] == 1 - intc_0 // 8 + intc_1 // 8 extract_uint64 - intc_1 // 1 + intc_0 // 1 == + assert // tests/artifacts/Arrays/uint64.py:125 // @arc4.abimethod() + intc_0 // 1 return @@ -1164,12 +1168,12 @@ test_allocations_for_header@2: stores // tests/artifacts/Arrays/uint64.py:138 // add_x(alloc_test, UInt64(1)) - intc_1 // 1 + intc_0 // 1 callsub add_x // tests/artifacts/Arrays/uint64.py:136 // for _i in urange(num): dup - intc_1 // 1 + intc_0 // 1 + bury 1 b test_allocations_for_header@2 @@ -1177,7 +1181,7 @@ test_allocations_for_header@2: test_allocations_after_for@5: // tests/artifacts/Arrays/uint64.py:134 // @arc4.abimethod() - intc_1 // 1 + intc_0 // 1 return @@ -1210,7 +1214,7 @@ test_iteration_for_header@2: bury 3 // tests/artifacts/Arrays/uint64.py:143 // for val in urange(5): - intc_1 // 1 + intc_0 // 1 + bury 1 b test_iteration_for_header@2 @@ -1220,7 +1224,7 @@ test_iteration_after_for@5: // tests/artifacts/Arrays/uint64.py:145 // assert arr.length == 5, "expected array of length 5" len - intc_0 // 8 + intc_1 // 8 / dup bury 10 @@ -1246,7 +1250,7 @@ test_iteration_for_header@6: dig 5 dup cover 2 - intc_0 // 8 + intc_1 // 8 * extract_uint64 // tests/artifacts/Arrays/uint64.py:150 @@ -1256,7 +1260,7 @@ test_iteration_for_header@6: >= assert // array is not sorted swap - intc_1 // 1 + intc_0 // 1 + bury 6 bury 4 @@ -1268,7 +1272,7 @@ test_iteration_after_for@9: // # enumerate // for idx, value in uenumerate(arr): len - intc_0 // 8 + intc_1 // 8 / bury 8 intc_2 // 0 @@ -1286,7 +1290,7 @@ test_iteration_for_header@10: dig 6 dup cover 2 - intc_0 // 8 + intc_1 // 8 * extract_uint64 // tests/artifacts/Arrays/uint64.py:155 @@ -1294,7 +1298,7 @@ test_iteration_for_header@10: dig 1 == assert // incorrect array value - intc_1 // 1 + intc_0 // 1 + bury 6 b test_iteration_for_header@10 @@ -1305,7 +1309,7 @@ test_iteration_after_for@13: // # reverse // for value in reversed(arr): len - intc_0 // 8 + intc_1 // 8 / bury 3 @@ -1316,13 +1320,13 @@ test_iteration_for_header@14: dig 2 bz test_iteration_after_for@17 dig 2 - intc_1 // 1 + intc_0 // 1 - dup bury 4 dig 2 swap - intc_0 // 8 + intc_1 // 8 * extract_uint64 // tests/artifacts/Arrays/uint64.py:159 @@ -1368,7 +1372,7 @@ test_iteration_for_header@18: uncover 2 intc_2 // 0 extract_uint16 - intc_1 // 1 + intc_0 // 1 + itob extract 6 2 @@ -1382,7 +1386,7 @@ test_iteration_for_header@18: bury 11 // tests/artifacts/Arrays/uint64.py:164 // for i in urange(5): - intc_1 // 1 + intc_0 // 1 + bury 7 b test_iteration_for_header@18 @@ -1396,7 +1400,7 @@ test_iteration_after_for@21: dup extract 2 0 len - intc_0 // 8 + intc_1 // 8 / itob extract 6 2 @@ -1406,37 +1410,39 @@ test_iteration_after_for@21: dup intc_2 // 0 extract_uint16 // on error: invalid array length header - pushint 10 // 10 + pushint 10 == assert // tests/artifacts/Arrays/uint64.py:169 // assert combined_arr[0] == 0 dup extract 2 8 - bytec_2 // 0x0000000000000000 + bytec_1 // 0x0000000000000000 b== assert // tests/artifacts/Arrays/uint64.py:170 // assert combined_arr[4] == 4 dup extract 34 8 - bytec_3 // 0x0000000000000004 + bytec_2 // 0x0000000000000004 b== assert // tests/artifacts/Arrays/uint64.py:171 // assert combined_arr[5] == 0 dup extract 42 8 - bytec_2 // 0x0000000000000000 + bytec_1 // 0x0000000000000000 b== assert // tests/artifacts/Arrays/uint64.py:172 // assert combined_arr[9] == 4 extract 74 8 - bytec_3 // 0x0000000000000004 + bytec_2 // 0x0000000000000004 b== + assert // tests/artifacts/Arrays/uint64.py:140 // @arc4.abimethod() + intc_0 // 1 return @@ -1460,7 +1466,7 @@ test_quicksort_for_header@2: // tests/artifacts/Arrays/uint64.py:178 // for b in Txn.sender.bytes: dup - pushint 32 // 32 + pushint 32 < bz test_quicksort_after_for@5 // tests/artifacts/Arrays/uint64.py:179 @@ -1477,7 +1483,7 @@ test_quicksort_for_header@2: itob concat // on error: max array length exceeded stores - intc_1 // 1 + intc_0 // 1 + bury 1 b test_quicksort_for_header@2 @@ -1489,16 +1495,16 @@ test_quicksort_after_for@5: dup loads len - intc_0 // 8 + intc_1 // 8 / dup - pushint 32 // 32 + pushint 32 == assert // expected array of length 32 // tests/artifacts/Arrays/uint64.py:182-183 // # sort the array // quicksort_window(rnd, UInt64(0), rnd.length - 1) - intc_1 // 1 + intc_0 // 1 - dig 1 intc_2 // 0 @@ -1513,7 +1519,7 @@ test_quicksort_after_for@5: // for value in rnd: loads len - intc_0 // 8 + intc_1 // 8 / bury 6 intc_2 // 0 @@ -1531,7 +1537,7 @@ test_quicksort_for_header@6: dig 5 dup cover 2 - intc_0 // 8 + intc_1 // 8 * extract_uint64 // tests/artifacts/Arrays/uint64.py:188 @@ -1541,7 +1547,7 @@ test_quicksort_for_header@6: >= assert // array is not sorted swap - intc_1 // 1 + intc_0 // 1 + bury 6 bury 4 @@ -1550,7 +1556,7 @@ test_quicksort_for_header@6: test_quicksort_after_for@9: // tests/artifacts/Arrays/uint64.py:174 // @arc4.abimethod() - intc_1 // 1 + intc_0 // 1 return @@ -1565,16 +1571,16 @@ test_unobserved_write: loads dup len - intc_0 // 8 + intc_1 // 8 / - intc_1 // 1 + intc_0 // 1 - // tests/artifacts/Arrays/uint64.py:195 // arr[last] = UInt64(0) # write intc_2 // 0 itob swap - intc_0 // 8 + intc_1 // 8 * uncover 2 dig 1 @@ -1589,7 +1595,7 @@ test_unobserved_write: callsub assert_last_is_zero // tests/artifacts/Arrays/uint64.py:197 // arr[last] = UInt64(1) # write - intc_1 // 1 + intc_0 // 1 itob dig 2 loads @@ -1603,10 +1609,12 @@ test_unobserved_write: // assert arr[last] == 1 swap extract_uint64 - intc_1 // 1 + intc_0 // 1 == + assert // tests/artifacts/Arrays/uint64.py:191 // @arc4.abimethod() + intc_0 // 1 return @@ -1615,7 +1623,7 @@ _puya_lib.mem.new_slot: load 0 bitlen load 0 - pushint 256 // 256 + pushint 256 dig 2 - intc_2 // 0 diff --git a/tests/artifacts/Arrays/data/Contract.arc56.json b/tests/artifacts/Arrays/data/Contract.arc56.json index f7431d8c..c1d919b4 100644 --- a/tests/artifacts/Arrays/data/Contract.arc56.json +++ b/tests/artifacts/Arrays/data/Contract.arc56.json @@ -238,115 +238,103 @@ "sourceInfo": [ { "pc": [ - 99 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 204 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 882 + 884 ], "errorMessage": "array is expected length" }, { "pc": [ - 1301, - 1380, - 1594 + 1307, + 1386, + 1602 ], "errorMessage": "array is not sorted" }, { "pc": [ - 960, - 990, - 998, - 1005, - 1010 + 962, + 992, + 1000, + 1007, + 1012 ], "errorMessage": "expected 4" }, { "pc": [ - 938 + 940 ], "errorMessage": "expected 5" }, { "pc": [ - 1548 + 1556 ], "errorMessage": "expected array of length 32" }, { "pc": [ - 1272 + 1278 ], "errorMessage": "expected array of length 5" }, { "pc": [ - 1343 + 1349 ], "errorMessage": "incorrect array value" }, { "pc": [ - 341, - 350, - 353, - 356, - 740, - 1106, - 1123, - 1179, - 1629, - 1648 + 314, + 323, + 326, + 329, + 713, + 1108, + 1125, + 1183, + 1637, + 1656 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 1464 + 1470 ], "errorMessage": "invalid array length header" }, { "pc": [ - 443, - 492, - 516, - 641, - 703, - 728, - 732, - 802, + 416, + 465, + 489, + 614, + 676, + 701, + 705, + 800, 829, 833, 837, - 863, - 886, - 903, - 918, - 961, - 1037, - 1252, - 1416, - 1434, - 1448, - 1528 + 865, + 888, + 905, + 920, + 963, + 1039, + 1258, + 1422, + 1440, + 1454, + 1536 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 1671 + 1681 ], "errorMessage": "no available slots" } @@ -359,19 +347,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDEgMCA1IDUxMgogICAgYnl0ZWNibG9jayAweCAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMyAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDA0CiAgICBwdXNoYnl0ZXMgMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBzdG9yZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMwogICAgLy8gY2xhc3MgQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTMzYmU4NzMgMHhlMGMzNzhlOSAweDM2NmY1MDlkIDB4NTgzNTFhNTAgMHhmYTk5ZTk4NCAweGEyMGU0NDBmIDB4MTc5YWMzZjkgMHg0NWRjYzgzNiAweGYxN2Y2ZjBhIDB4ODQ1ZTFiNGUgMHg3NjIxY2ZkMSAweDU2NjFhNjdjIC8vIG1ldGhvZCAidGVzdF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9leHRlbmQoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfbXVsdGlwbGVfYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJvdmVyaGVhZCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV90b29fbG9uZygpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmQoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlcigpdm9pZCIsIG1ldGhvZCAidGVzdF9hcnJheV9hc3NpZ25tZW50X21heGltdW1fY3Vyc2FnZSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hbGxvY2F0aW9ucyh1aW50NjQpdm9pZCIsIG1ldGhvZCAidGVzdF9pdGVyYXRpb24oKXZvaWQiLCBtZXRob2QgInRlc3RfcXVpY2tzb3J0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3Vub2JzZXJ2ZWRfd3JpdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2FycmF5IHRlc3RfYXJyYXlfZXh0ZW5kIHRlc3RfYXJyYXlfbXVsdGlwbGVfYXBwZW5kIG1haW5fb3ZlcmhlYWRfcm91dGVANyB0ZXN0X2FycmF5X3Rvb19sb25nIHRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kIHRlc3RfYXJyYXlfZXZhbHVhdGlvbl9vcmRlciB0ZXN0X2FycmF5X2Fzc2lnbm1lbnRfbWF4aW11bV9jdXJzYWdlIHRlc3RfYWxsb2NhdGlvbnMgdGVzdF9pdGVyYXRpb24gdGVzdF9xdWlja3NvcnQgdGVzdF91bm9ic2VydmVkX3dyaXRlCiAgICBlcnIKCm1haW5fb3ZlcmhlYWRfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQucXVpY2tzb3J0X3dpbmRvdyhhcnI6IHVpbnQ2NCwgd2luZG93X2xlZnQ6IHVpbnQ2NCwgd2luZG93X3JpZ2h0OiB1aW50NjQpIC0+IHZvaWQ6CnF1aWNrc29ydF93aW5kb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMDEtMjA0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHF1aWNrc29ydF93aW5kb3coCiAgICAvLyAgICAgYXJyOiBSZWZlcmVuY2VBcnJheVtVSW50NjRdLCB3aW5kb3dfbGVmdDogVUludDY0LCB3aW5kb3dfcmlnaHQ6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIwNwogICAgLy8gcGl2b3QgPSBhcnJbKHdpbmRvd19sZWZ0ICsgd2luZG93X3JpZ2h0KSAvLyAyXQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAvCiAgICBmcmFtZV9kaWcgLTMKICAgIGxvYWRzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCgpxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjExLTIxMgogICAgLy8gIyBtb3ZlIGxlZnQgb2Ygd2luZG93IHRvd2FyZHMgcGl2b3QKICAgIC8vIHdoaWxlIGFycltsZWZ0XSA8IHBpdm90OgogICAgZnJhbWVfZGlnIC0zCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMTMKICAgIC8vIGxlZnQgKz0gMQogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BAMwoKcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIxNC0yMTUKICAgIC8vICMgbW92ZSByaWdodCBvZiB3aW5kb3cgdG93YXJkcyBwaXZvdAogICAgLy8gd2hpbGUgcGl2b3QgPCBhcnJbcmlnaHRdOgogICAgZnJhbWVfZGlnIC0zCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMTYtMjE3CiAgICAvLyAjIGJyZWFrIG91dCBvZiBsb29wIGlmIHJpZ2h0IHdvdWxkIGdvIG5lZ2F0aXZlCiAgICAvLyBpZiBub3QgcmlnaHQ6CiAgICBmcmFtZV9kaWcgMwogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjE5CiAgICAvLyByaWdodCAtPSAxCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGZyYW1lX2J1cnkgMwogICAgYiBxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEA2CgpxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjQ3LTI0OAogICAgLy8gIyBzb3J0IGxlZnQgaGFsZiBvZiB3aW5kb3cKICAgIC8vIGlmIHdpbmRvd19sZWZ0IDwgcmlnaHQ6CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI0OQogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhhcnIsIHdpbmRvd19sZWZ0LCByaWdodCkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMwogICAgY2FsbHN1YiBxdWlja3NvcnRfd2luZG93CgpxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTAtMjUxCiAgICAvLyAjIHNvcnQgcmlnaHQgaGFsZiBvZiB3aW5kb3cKICAgIC8vIGlmIGxlZnQgPCB3aW5kb3dfcmlnaHQ6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1MgogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhhcnIsIGxlZnQsIHdpbmRvd19yaWdodCkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBxdWlja3NvcnRfd2luZG93CgpxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMjY6CiAgICByZXRzdWIKCnF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMjEtMjIyCiAgICAvLyAjIGlmIHdpbmRvdyBpc24ndCBlbXB0eSB0aGVuIHN3YXAgdmFsdWVzIGFuZCBtb3ZlIHdpbmRvdyBpbgogICAgLy8gaWYgbGVmdCA8IHJpZ2h0OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyMwogICAgLy8gYXJyW2xlZnRdLCBhcnJbcmlnaHRdID0gYXJyW3JpZ2h0XSwgYXJyW2xlZnRdCiAgICBmcmFtZV9kaWcgLTMKICAgIGxvYWRzCiAgICBkdXAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjb3ZlciAzCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyNAogICAgLy8gbGVmdCArPSAxCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjI1LTIyNgogICAgLy8gIyBicmVhayBvdXQgb2YgbG9vcCBpZiByaWdodCB3b3VsZCBnbyBuZWdhdGl2ZQogICAgLy8gaWYgbm90IHJpZ2h0OgogICAgZnJhbWVfZGlnIDMKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyOAogICAgLy8gcmlnaHQgLT0gMQogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjI5LTIzMAogICAgLy8gIyBleHBsaWNpdCBjb250aW51ZSB0byBhdm9pZCBoaXR0aW5nIG91dGVyIGJyZWFrCiAgICAvLyBpZiBsZWZ0IDw9IHJpZ2h0OgogICAgZnJhbWVfZGlnIDQKICAgID49CiAgICBibnogcXVpY2tzb3J0X3dpbmRvd193aGlsZV90b3BAMwogICAgYiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCgpxdWlja3NvcnRfd2luZG93X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMzUtMjM2CiAgICAvLyAjIGlmIHdpbmRvdyBpcyBqdXN0IG9uZSBpdGVtLCBkb24ndCBib3RoZXIgc3dhcHBpbmcsIGJ1dCBzdGlsbCBhZGp1c3Qgd2luZG93CiAgICAvLyBpZiBsZWZ0ID09IHJpZ2h0OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA9PQogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjM3CiAgICAvLyBsZWZ0ICs9IDEKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMzgtMjM5CiAgICAvLyAjIGRvbid0IGRlY3JlbWVudCByaWdodCBpZiBpdCB3b3VsZCBnbyBuZWdhdGl2ZQogICAgLy8gaWYgcmlnaHQ6CiAgICBmcmFtZV9kaWcgMwogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjQwCiAgICAvLyByaWdodCAtPSAxCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGZyYW1lX2J1cnkgMwogICAgYiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuY3JlYXRlX2FycmF5KCkgLT4gdWludDY0OgpjcmVhdGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTUtMjU2CiAgICAvLyBAc3Vicm91dGluZShpbmxpbmU9RmFsc2UpCiAgICAvLyBkZWYgY3JlYXRlX2FycmF5KCkgLT4gUmVmZXJlbmNlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU3CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICBieXRlY18wIC8vIDB4CiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18yIC8vIDAKCmNyZWF0ZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzMgLy8gNQogICAgPAogICAgYnogY3JlYXRlX2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTkKICAgIC8vIGFyci5hcHBlbmQoaSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxvYWRzCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNyZWF0ZV9hcnJheV9mb3JfaGVhZGVyQDEKCmNyZWF0ZV9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI2MAogICAgLy8gcmV0dXJuIGFycgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuYXNzZXJ0X2xhc3RfaXNfemVybyhhcnI6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X2xhc3RfaXNfemVybzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI2My0yNjQKICAgIC8vIEBzdWJyb3V0aW5lKGlubGluZT1GYWxzZSkKICAgIC8vIGRlZiBhc3NlcnRfbGFzdF9pc196ZXJvKGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjY1CiAgICAvLyBhc3NlcnQgYXJyW2Fyci5sZW5ndGggLSAxXSA9PSAwCiAgICBmcmFtZV9kaWcgLTEKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgICEKICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuYWRkX3goYXJyOiB1aW50NjQsIHg6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkX3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzctMjc4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkZF94KGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSwgeDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMiAvLyAwCgphZGRfeF9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgIGJ6IGFkZF94X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODAKICAgIC8vIGFyci5hcHBlbmQoaSkKICAgIGZyYW1lX2RpZyAtMgogICAgbG9hZHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBhZGRfeF9mb3JfaGVhZGVyQDEKCmFkZF94X2FmdGVyX2ZvckA0OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycjogdWludDY0KSAtPiB1aW50NjQ6CmFwcGVuZF9sZW5ndGhfYW5kX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI5MS0yOTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSkgLT4gUmVmZXJlbmNlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjkzCiAgICAvLyBhcnIuYXBwZW5kKGFyci5sZW5ndGgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI5NAogICAgLy8gcmV0dXJuIGFycgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOQogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoNDIpKQogICAgcHVzaGludCA0MiAvLyA0MgogICAgaXRvYgogICAgZGlnIDEKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjMKICAgIC8vIGFkZF94KGFyciwgVUludDY0KDUpKQogICAgZHVwCiAgICBpbnRjXzMgLy8gNQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjcKICAgIC8vIHBvcF94KGFyciwgeD1VSW50NjQoMyksIGV4cGVjdGVkPVVJbnQ2NCg0KSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODUKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3CiAgICAvLyBwb3BfeChhcnIsIHg9VUludDY0KDMpLCBleHBlY3RlZD1VSW50NjQoNCkpCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg2CiAgICAvLyBwb3BwZWQgPSBhcnIucG9wKCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgLQogICAgZGlnIDIKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMgogICAgZXh0cmFjdDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg3CiAgICAvLyBhc3NlcnQgcG9wcGVkID09IGV4cGVjdGVkCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODgKICAgIC8vIGV4cGVjdGVkIC09IDEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAzCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozMQogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MyAvLyA0MwogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAyCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjMyCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjMzCiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDMgLy8gNDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM2CiAgICAvLyBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM3CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNAogICAgZHVwCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMTQgLy8gMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjM4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA5CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQwCiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0IC8vIDQ0CiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQxCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMTUgLy8gMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQyCiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0NAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3MgogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoOTkpKQogICAgcHVzaGludCA5OSAvLyA5OQogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzMKICAgIC8vIGFycjIuYXBwZW5kKFVJbnQ2NCgxMDApKQogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQ0CiAgICAvLyByZXR1cm5fcmVmKGFyciwgYXJyKVswXSArPSAyCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0NQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMTcKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDE3IC8vIDE3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0NAogICAgZGlnIDEKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NCAvLyA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDcKICAgIC8vIGFzc2VydCBhcnJbLTJdID09IDk5CiAgICBkdXAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDk5IC8vIDk5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0OAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMTAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfZXh0ZW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9leHRlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1MgogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1MwogICAgLy8gYWRkX3goYXJyLCBVSW50NjQoMSkpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1NwogICAgLy8gYXJyMi5hcHBlbmQoVUludDY0KDMpKQogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1OQogICAgLy8gYXJyLmV4dGVuZChhcnIyKQogICAgZHVwCiAgICBsb2FkcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTcKICAgIC8vIGFycjIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjU5CiAgICAvLyBhcnIuZXh0ZW5kKGFycjIpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGRpZyAxCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV9tdWx0aXBsZV9hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X211bHRpcGxlX2FwcGVuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY0CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICBieXRlY18wIC8vIDB4CiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY1CiAgICAvLyBhZGRfeChhcnIsIFVJbnQ2NCgxKSkKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY2CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgxKSkKICAgIGR1cAogICAgbG9hZHMKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY3CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgyKSkKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY4CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGRpZyAxCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY5CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV90b29fbG9uZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXlfdG9vX2xvbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo3NwogICAgLy8gYXJyYXkgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNTEyKToKICAgIGludGNfMiAvLyAwCgp0ZXN0X2FycmF5X3Rvb19sb25nX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNTEyKToKICAgIGR1cAogICAgaW50YyA0IC8vIDUxMgogICAgPAogICAgYnogdGVzdF9hcnJheV90b29fbG9uZ19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NzkKICAgIC8vIGFycmF5LmFwcGVuZChpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NzgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1MTIpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X3Rvb19sb25nX2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV90b29fbG9uZ19hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4MAogICAgLy8gYXNzZXJ0IGFycmF5Lmxlbmd0aCA9PSA1MTIsICJhcnJheSBpcyBleHBlY3RlZCBsZW5ndGgiCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGMgNCAvLyA1MTIKICAgID09CiAgICBhc3NlcnQgLy8gYXJyYXkgaXMgZXhwZWN0ZWQgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4MgogICAgLy8gYXJyYXkuYXBwZW5kKFVJbnQ2NCg1MTIpKSAgIyB0aGlzIHdpbGwgZmFpbAogICAgaW50YyA0IC8vIDUxMgogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NgogICAgLy8gYXJyYXkgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojg3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmRfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4OAogICAgLy8gYXJyYXkuYXBwZW5kKGkpCiAgICBkdXAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2NvcHlfYW5kX2V4dGVuZF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTEKICAgIC8vIGFycmF5LmFwcGVuZChVSW50NjQoNSkpCiAgICBpbnRjXzMgLy8gNQogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5MgogICAgLy8gYXNzZXJ0IGFycmF5Lmxlbmd0aCA9PSA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjkzCiAgICAvLyBhc3NlcnQgYXJyYXlbLTFdID09IDUsICJleHBlY3RlZCA1IgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDUKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5NQogICAgLy8gYXNzZXJ0IGFycmF5Mi5sZW5ndGggPT0gNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBkdXAKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5NgogICAgLy8gYXNzZXJ0IGFycmF5MlstMV0gPT0gNCwgImV4cGVjdGVkIDQiCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTgKICAgIC8vIGFycmF5LmV4dGVuZChhcnJheTIpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojk5CiAgICAvLyBhc3NlcnQgYXJyYXkubGVuZ3RoID09IDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCAxMSAvLyAxMQogICAgPT0KICAgIGFzc2VydAogICAgdW5jb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDAKICAgIC8vIGFzc2VydCBhcnJheTIubGVuZ3RoID09IDUKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDEKICAgIC8vIGFzc2VydCBhcnJheVstMV0gPT0gNCwgImV4cGVjdGVkIDQiCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTAyCiAgICAvLyBhc3NlcnQgYXJyYXlbNF0gPT0gNCwgImV4cGVjdGVkIDQiCiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDMKICAgIC8vIGFzc2VydCBhcnJheVs1XSA9PSA1LCAiZXhwZWN0ZWQgNCIKICAgIGR1cAogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwNAogICAgLy8gYXNzZXJ0IGFycmF5WzZdID09IDAsICJleHBlY3RlZCA0IgogICAgcHVzaGludCA0OCAvLyA0OAogICAgZXh0cmFjdF91aW50NjQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2FycmF5X2V2YWx1YXRpb25fb3JkZXJbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X2V2YWx1YXRpb25fb3JkZXI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDgKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDkKICAgIC8vIGFyci5hcHBlbmQoVUludDY0KDMpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExMAogICAgLy8gYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycikuZXh0ZW5kKGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnIpKQogICAgZHVwCiAgICBjYWxsc3ViIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybgogICAgZGlnIDEKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBsb2FkcwogICAgZGlnIDEKICAgIGxvYWRzCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTExCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTIKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMwogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTMKICAgIC8vIGFzc2VydCBhcnJbMV0gPT0gMQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTQKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMgogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjExNQogICAgLy8gYXNzZXJ0IGFyclszXSA9PSAzCiAgICBkdXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTE2CiAgICAvLyBhc3NlcnQgYXJyWzRdID09IDEKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTcKICAgIC8vIGFzc2VydCBhcnJbNV0gPT0gMgogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTkKICAgIC8vIGFyclthcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyKVswXV0gPSBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyKVstMV0KICAgIGR1cAogICAgY2FsbHN1YiBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4KICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBsb2FkcwogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgbG9hZHMKICAgIHN3YXAKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIwCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjEKICAgIC8vIGFzc2VydCBhcnJbNl0gPT0gNgogICAgZHVwCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyMgogICAgLy8gYXNzZXJ0IGFycls3XSA9PSA3CiAgICBkdXAKICAgIHB1c2hpbnQgNTYgLy8gNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIzCiAgICAvLyBhc3NlcnQgYXJyWzNdID09IDYKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfYXNzaWdubWVudF9tYXhpbXVtX2N1cnNhZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X2Fzc2lnbm1lbnRfbWF4aW11bV9jdXJzYWdlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTI3CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTI4CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICBkaWcgMQogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMjkKICAgIC8vIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybihhcnIpWzBdID0gVUludDY0KDQyKQogICAgZHVwCiAgICBjYWxsc3ViIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybgogICAgcHVzaGludCA0MiAvLyA0MgogICAgaXRvYgogICAgZGlnIDEKICAgIGxvYWRzCiAgICBzd2FwCiAgICByZXBsYWNlMiAwIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDIKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gNDIKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzIKICAgIC8vIGFzc2VydCBhcnJbMV0gPT0gMQogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYWxsb2NhdGlvbnNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FsbG9jYXRpb25zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG51bSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hbGxvY2F0aW9uc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzYKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UobnVtKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYWxsb2NhdGlvbnNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzNwogICAgLy8gYWxsb2NfdGVzdCA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM4CiAgICAvLyBhZGRfeChhbGxvY190ZXN0LCBVSW50NjQoMSkpCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG51bSk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hbGxvY2F0aW9uc19mb3JfaGVhZGVyQDIKCnRlc3RfYWxsb2NhdGlvbnNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9pdGVyYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2l0ZXJhdGlvbjoKICAgIGludGNfMiAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0MgogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBkdXBuIDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0MwogICAgLy8gZm9yIHZhbCBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQzCiAgICAvLyBmb3IgdmFsIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDQKICAgIC8vIGFyci5hcHBlbmQodmFsKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQzCiAgICAvLyBmb3IgdmFsIGluIHVyYW5nZSg1KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUsICJleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggNSIKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGR1cAogICAgYnVyeSAxMAogICAgaW50Y18zIC8vIDUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXkgb2YgbGVuZ3RoIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0Ny0xNDgKICAgIC8vICMgaXRlcmF0ZQogICAgLy8gbGFzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNAogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQ5CiAgICAvLyBmb3IgdmFsdWUgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAOQogICAgZGlnIDEKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTUwCiAgICAvLyBhc3NlcnQgdmFsdWUgPj0gbGFzdCwgImFycmF5IGlzIG5vdCBzb3J0ZWQiCiAgICBkdXAKICAgIGRpZyA2CiAgICA+PQogICAgYXNzZXJ0IC8vIGFycmF5IGlzIG5vdCBzb3J0ZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKICAgIGJ1cnkgNAogICAgYiB0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDYKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA5OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1My0xNTQKICAgIC8vICMgZW51bWVyYXRlCiAgICAvLyBmb3IgaWR4LCB2YWx1ZSBpbiB1ZW51bWVyYXRlKGFycik6CiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBidXJ5IDgKICAgIGludGNfMiAvLyAwCiAgICBidXJ5IDYKCnRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTMtMTU0CiAgICAvLyAjIGVudW1lcmF0ZQogICAgLy8gZm9yIGlkeCwgdmFsdWUgaW4gdWVudW1lcmF0ZShhcnIpOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGlkeCwgImluY29ycmVjdCBhcnJheSB2YWx1ZSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGluY29ycmVjdCBhcnJheSB2YWx1ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgogICAgYiB0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDEwCgp0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTM6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTU3LTE1OAogICAgLy8gIyByZXZlcnNlCiAgICAvLyBmb3IgdmFsdWUgaW4gcmV2ZXJzZWQoYXJyKToKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGJ1cnkgMwoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1Ny0xNTgKICAgIC8vICMgcmV2ZXJzZQogICAgLy8gZm9yIHZhbHVlIGluIHJldmVyc2VkKGFycik6CiAgICBkaWcgMgogICAgYnogdGVzdF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDE3CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgYnVyeSA0CiAgICBkaWcgMgogICAgc3dhcAogICAgaW50Y18wIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTkKICAgIC8vIGFzc2VydCB2YWx1ZSA8PSBsYXN0LCAiYXJyYXkgaXMgbm90IHNvcnRlZCIKICAgIGR1cAogICAgZGlnIDUKICAgIDw9CiAgICBhc3NlcnQgLy8gYXJyYXkgaXMgbm90IHNvcnRlZAogICAgYnVyeSA0CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTQKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2MgogICAgLy8gYXJjNF9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQyCiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGJ1cnkgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNwoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZGlnIDYKICAgIGludGNfMyAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMjEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NQogICAgLy8gYXJjNF9hcnIuYXBwZW5kKGFyYzQuVUludDY0KGkpKQogICAgZGlnIDYKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIGRpZyAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY2CiAgICAvLyBuYXRpdmVfYXJyLmFwcGVuZChhcmM0LlVJbnQ2NChpKSkKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA3CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTgKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NwogICAgLy8gY29tYmluZWRfYXJyID0gYXJjNF9hcnIgKyBuYXRpdmVfYXJyCiAgICBkaWcgMTAKICAgIGRpZyAxMAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY4CiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyLmxlbmd0aCA9PSAxMAogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY5CiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzBdID09IDAKICAgIGR1cAogICAgZXh0cmFjdCAyIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTcwCiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzRdID09IDQKICAgIGR1cAogICAgZXh0cmFjdCAzNCA4CiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGNvbWJpbmVkX2Fycls1XSA9PSAwCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzIKICAgIC8vIGFzc2VydCBjb21iaW5lZF9hcnJbOV0gPT0gNAogICAgZXh0cmFjdCA3NCA4CiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3F1aWNrc29ydFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcXVpY2tzb3J0OgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzYtMTc3CiAgICAvLyAjIGNyZWF0ZSBwc2V1ZG8gcmFuZG9tIGFycmF5IGZyb20gc2VuZGVyIGFkZHJlc3MKICAgIC8vIHJuZCA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTc4CiAgICAvLyBmb3IgYiBpbiBUeG4uc2VuZGVyLmJ5dGVzOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18yIC8vIDAKCnRlc3RfcXVpY2tzb3J0X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OAogICAgLy8gZm9yIGIgaW4gVHhuLnNlbmRlci5ieXRlczoKICAgIGR1cAogICAgcHVzaGludCAzMiAvLyAzMgogICAgPAogICAgYnogdGVzdF9xdWlja3NvcnRfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OQogICAgLy8gcm5kLmFwcGVuZChvcC5idG9pKGIpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRieXRlCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsb2FkcwogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzdG9yZXMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckAyCgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4MAogICAgLy8gYXNzZXJ0IHJuZC5sZW5ndGggPT0gMzIsICJleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggMzIiCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5IG9mIGxlbmd0aCAzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTgyLTE4MwogICAgLy8gIyBzb3J0IHRoZSBhcnJheQogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhybmQsIFVJbnQ2NCgwKSwgcm5kLmxlbmd0aCAtIDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgcXVpY2tzb3J0X3dpbmRvdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg1LTE4NgogICAgLy8gIyBhcnJheSBzaG91bGQgbm93IGJlIGluIGFzY2VuZGluZyBvcmRlcgogICAgLy8gbGFzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgbG9hZHMKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGJ1cnkgNgogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgZGlnIDQKICAgIGRpZyA2CiAgICA8CiAgICBieiB0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOQogICAgZGlnIDIKICAgIGxvYWRzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4OAogICAgLy8gYXNzZXJ0IHZhbHVlID49IGxhc3QsICJhcnJheSBpcyBub3Qgc29ydGVkIgogICAgZHVwCiAgICBkaWcgNgogICAgPj0KICAgIGFzc2VydCAvLyBhcnJheSBpcyBub3Qgc29ydGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBidXJ5IDQKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2Cgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3Vub2JzZXJ2ZWRfd3JpdGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3Vub2JzZXJ2ZWRfd3JpdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTMKICAgIC8vIGFyciA9IGNyZWF0ZV9hcnJheSgpCiAgICBjYWxsc3ViIGNyZWF0ZV9hcnJheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk0CiAgICAvLyBsYXN0ID0gYXJyLmxlbmd0aCAtIDEKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE5NQogICAgLy8gYXJyW2xhc3RdID0gVUludDY0KDApICAjIHdyaXRlCiAgICBpbnRjXzIgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18wIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTYKICAgIC8vIGFzc2VydF9sYXN0X2lzX3plcm8oYXJyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X2xhc3RfaXNfemVybwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk3CiAgICAvLyBhcnJbbGFzdF0gPSBVSW50NjQoMSkgICMgd3JpdGUKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBkaWcgMgogICAgbG9hZHMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTgKICAgIC8vIGFzc2VydCBhcnJbbGFzdF0gPT0gMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLm1lbS5uZXdfc2xvdCgpIC0+IHVpbnQ2NDoKX3B1eWFfbGliLm1lbS5uZXdfc2xvdDoKICAgIGxvYWQgMAogICAgYml0bGVuCiAgICBsb2FkIDAKICAgIHB1c2hpbnQgMjU2IC8vIDI1NgogICAgZGlnIDIKICAgIC0KICAgIGludGNfMiAvLyAwCiAgICBzZXRiaXQgLy8gb24gZXJyb3I6IG5vIGF2YWlsYWJsZSBzbG90cwogICAgc3RvcmUgMAogICAgcmV0c3ViCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggMCA1IDUxMgogICAgYnl0ZWNibG9jayAweCAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDA0CiAgICBwdXNoYnl0ZXMgMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBzdG9yZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMwogICAgLy8gY2xhc3MgQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGEzM2JlODczIDB4ZTBjMzc4ZTkgMHgzNjZmNTA5ZCAweDU4MzUxYTUwIDB4ZmE5OWU5ODQgMHhhMjBlNDQwZiAweDE3OWFjM2Y5IDB4NDVkY2M4MzYgMHhmMTdmNmYwYSAweDg0NWUxYjRlIDB4NzYyMWNmZDEgMHg1NjYxYTY3YyAvLyBtZXRob2QgInRlc3RfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfZXh0ZW5kKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FycmF5X211bHRpcGxlX2FwcGVuZCgpdm9pZCIsIG1ldGhvZCAib3ZlcmhlYWQoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfdG9vX2xvbmcoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FycmF5X2V2YWx1YXRpb25fb3JkZXIoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJyYXlfYXNzaWdubWVudF9tYXhpbXVtX2N1cnNhZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYWxsb2NhdGlvbnModWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfaXRlcmF0aW9uKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3F1aWNrc29ydCgpdm9pZCIsIG1ldGhvZCAidGVzdF91bm9ic2VydmVkX3dyaXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9hcnJheSB0ZXN0X2FycmF5X2V4dGVuZCB0ZXN0X2FycmF5X211bHRpcGxlX2FwcGVuZCBtYWluX292ZXJoZWFkX3JvdXRlQDcgdGVzdF9hcnJheV90b29fbG9uZyB0ZXN0X2FycmF5X2NvcHlfYW5kX2V4dGVuZCB0ZXN0X2FycmF5X2V2YWx1YXRpb25fb3JkZXIgdGVzdF9hcnJheV9hc3NpZ25tZW50X21heGltdW1fY3Vyc2FnZSB0ZXN0X2FsbG9jYXRpb25zIHRlc3RfaXRlcmF0aW9uIHRlc3RfcXVpY2tzb3J0IHRlc3RfdW5vYnNlcnZlZF93cml0ZQogICAgZXJyCgptYWluX292ZXJoZWFkX3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LnF1aWNrc29ydF93aW5kb3coYXJyOiB1aW50NjQsIHdpbmRvd19sZWZ0OiB1aW50NjQsIHdpbmRvd19yaWdodDogdWludDY0KSAtPiB2b2lkOgpxdWlja3NvcnRfd2luZG93OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjAxLTIwNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBxdWlja3NvcnRfd2luZG93KAogICAgLy8gICAgIGFycjogUmVmZXJlbmNlQXJyYXlbVUludDY0XSwgd2luZG93X2xlZnQ6IFVJbnQ2NCwgd2luZG93X3JpZ2h0OiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMDcKICAgIC8vIHBpdm90ID0gYXJyWyh3aW5kb3dfbGVmdCArIHdpbmRvd19yaWdodCkgLy8gMl0KICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBwdXNoaW50IDIKICAgIC8KICAgIGZyYW1lX2RpZyAtMwogICAgbG9hZHMKICAgIHN3YXAKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKCnF1aWNrc29ydF93aW5kb3dfd2hpbGVfdG9wQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMTEtMjEyCiAgICAvLyAjIG1vdmUgbGVmdCBvZiB3aW5kb3cgdG93YXJkcyBwaXZvdAogICAgLy8gd2hpbGUgYXJyW2xlZnRdIDwgcGl2b3Q6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxvYWRzCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfd2hpbGVfdG9wQDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIxMwogICAgLy8gbGVmdCArPSAxCiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEAzCgpxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjE0LTIxNQogICAgLy8gIyBtb3ZlIHJpZ2h0IG9mIHdpbmRvdyB0b3dhcmRzIHBpdm90CiAgICAvLyB3aGlsZSBwaXZvdCA8IGFycltyaWdodF06CiAgICBmcmFtZV9kaWcgLTMKICAgIGxvYWRzCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIxNi0yMTcKICAgIC8vICMgYnJlYWsgb3V0IG9mIGxvb3AgaWYgcmlnaHQgd291bGQgZ28gbmVnYXRpdmUKICAgIC8vIGlmIG5vdCByaWdodDoKICAgIGZyYW1lX2RpZyAzCiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMTkKICAgIC8vIHJpZ2h0IC09IDEKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZnJhbWVfYnVyeSAzCiAgICBiIHF1aWNrc29ydF93aW5kb3dfd2hpbGVfdG9wQDYKCnF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNDctMjQ4CiAgICAvLyAjIHNvcnQgbGVmdCBoYWxmIG9mIHdpbmRvdwogICAgLy8gaWYgd2luZG93X2xlZnQgPCByaWdodDoKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjQ5CiAgICAvLyBxdWlja3NvcnRfd2luZG93KGFyciwgd2luZG93X2xlZnQsIHJpZ2h0KQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAzCiAgICBjYWxsc3ViIHF1aWNrc29ydF93aW5kb3cKCnF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1MC0yNTEKICAgIC8vICMgc29ydCByaWdodCBoYWxmIG9mIHdpbmRvdwogICAgLy8gaWYgbGVmdCA8IHdpbmRvd19yaWdodDoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfaWZfZWxzZUAyNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjUyCiAgICAvLyBxdWlja3NvcnRfd2luZG93KGFyciwgbGVmdCwgd2luZG93X3JpZ2h0KQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHF1aWNrc29ydF93aW5kb3cKCnF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIHJldHN1YgoKcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIyMS0yMjIKICAgIC8vICMgaWYgd2luZG93IGlzbid0IGVtcHR5IHRoZW4gc3dhcCB2YWx1ZXMgYW5kIG1vdmUgd2luZG93IGluCiAgICAvLyBpZiBsZWZ0IDwgcmlnaHQ6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjIzCiAgICAvLyBhcnJbbGVmdF0sIGFycltyaWdodF0gPSBhcnJbcmlnaHRdLCBhcnJbbGVmdF0KICAgIGZyYW1lX2RpZyAtMwogICAgbG9hZHMKICAgIGR1cAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNvdmVyIDMKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjI0CiAgICAvLyBsZWZ0ICs9IDEKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMjUtMjI2CiAgICAvLyAjIGJyZWFrIG91dCBvZiBsb29wIGlmIHJpZ2h0IHdvdWxkIGdvIG5lZ2F0aXZlCiAgICAvLyBpZiBub3QgcmlnaHQ6CiAgICBmcmFtZV9kaWcgMwogICAgYnogcXVpY2tzb3J0X3dpbmRvd19hZnRlcl93aGlsZUAyMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjI4CiAgICAvLyByaWdodCAtPSAxCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMjktMjMwCiAgICAvLyAjIGV4cGxpY2l0IGNvbnRpbnVlIHRvIGF2b2lkIGhpdHRpbmcgb3V0ZXIgYnJlYWsKICAgIC8vIGlmIGxlZnQgPD0gcmlnaHQ6CiAgICBmcmFtZV9kaWcgNAogICAgPj0KICAgIGJueiBxdWlja3NvcnRfd2luZG93X3doaWxlX3RvcEAzCiAgICBiIHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjIKCnF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIzNS0yMzYKICAgIC8vICMgaWYgd2luZG93IGlzIGp1c3Qgb25lIGl0ZW0sIGRvbid0IGJvdGhlciBzd2FwcGluZywgYnV0IHN0aWxsIGFkanVzdCB3aW5kb3cKICAgIC8vIGlmIGxlZnQgPT0gcmlnaHQ6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgID09CiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMzcKICAgIC8vIGxlZnQgKz0gMQogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjIzOC0yMzkKICAgIC8vICMgZG9uJ3QgZGVjcmVtZW50IHJpZ2h0IGlmIGl0IHdvdWxkIGdvIG5lZ2F0aXZlCiAgICAvLyBpZiByaWdodDoKICAgIGZyYW1lX2RpZyAzCiAgICBieiBxdWlja3NvcnRfd2luZG93X2FmdGVyX3doaWxlQDIyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNDAKICAgIC8vIHJpZ2h0IC09IDEKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZnJhbWVfYnVyeSAzCiAgICBiIHF1aWNrc29ydF93aW5kb3dfYWZ0ZXJfd2hpbGVAMjIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5jcmVhdGVfYXJyYXkoKSAtPiB1aW50NjQ6CmNyZWF0ZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1NS0yNTYKICAgIC8vIEBzdWJyb3V0aW5lKGlubGluZT1GYWxzZSkKICAgIC8vIGRlZiBjcmVhdGVfYXJyYXkoKSAtPiBSZWZlcmVuY2VBcnJheVtVSW50NjRdOgogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTcKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjU4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAoKY3JlYXRlX2FycmF5X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMyAvLyA1CiAgICA8CiAgICBieiBjcmVhdGVfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1OQogICAgLy8gYXJyLmFwcGVuZChpKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgbG9hZHMKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNTgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY3JlYXRlX2FycmF5X2Zvcl9oZWFkZXJAMQoKY3JlYXRlX2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjYwCiAgICAvLyByZXR1cm4gYXJyCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5hc3NlcnRfbGFzdF9pc196ZXJvKGFycjogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbGFzdF9pc196ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjYzLTI2NAogICAgLy8gQHN1YnJvdXRpbmUoaW5saW5lPUZhbHNlKQogICAgLy8gZGVmIGFzc2VydF9sYXN0X2lzX3plcm8oYXJyOiBSZWZlcmVuY2VBcnJheVtVSW50NjRdKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNjUKICAgIC8vIGFzc2VydCBhcnJbYXJyLmxlbmd0aCAtIDFdID09IDAKICAgIGZyYW1lX2RpZyAtMQogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5hZGRfeChhcnI6IHVpbnQ2NCwgeDogdWludDY0KSAtPiB2b2lkOgphZGRfeDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3Ny0yNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWRkX3goYXJyOiBSZWZlcmVuY2VBcnJheVtVSW50NjRdLCB4OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18yIC8vIDAKCmFkZF94X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogYWRkX3hfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4MAogICAgLy8gYXJyLmFwcGVuZChpKQogICAgZnJhbWVfZGlnIC0yCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5hcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyOiB1aW50NjQpIC0+IHVpbnQ2NDoKYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjkxLTI5MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyOiBSZWZlcmVuY2VBcnJheVtVSW50NjRdKSAtPiBSZWZlcmVuY2VBcnJheVtVSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyOTMKICAgIC8vIGFyci5hcHBlbmQoYXJyLmxlbmd0aCkKICAgIGZyYW1lX2RpZyAtMQogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjk0CiAgICAvLyByZXR1cm4gYXJyCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTYKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE5CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCg0MikpCiAgICBwdXNoaW50IDQyCiAgICBpdG9iCiAgICBkaWcgMQogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyMwogICAgLy8gYWRkX3goYXJyLCBVSW50NjQoNSkpCiAgICBkdXAKICAgIGludGNfMyAvLyA1CiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI1CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3CiAgICAvLyBwb3BfeChhcnIsIHg9VUludDY0KDMpLCBleHBlY3RlZD1VSW50NjQoNCkpCiAgICBwdXNoaW50IDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGludGNfMiAvLyAwCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjcKICAgIC8vIHBvcF94KGFyciwgeD1VSW50NjQoMyksIGV4cGVjdGVkPVVJbnQ2NCg0KSkKICAgIHB1c2hpbnQgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg1CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg2CiAgICAvLyBwb3BwZWQgPSBhcnIucG9wKCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgLQogICAgZGlnIDIKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMgogICAgZXh0cmFjdDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6Mjg3CiAgICAvLyBhc3NlcnQgcG9wcGVkID09IGV4cGVjdGVkCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyODgKICAgIC8vIGV4cGVjdGVkIC09IDEKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4NQogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAzCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MjkKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDEKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MzEKICAgIC8vIGFyci5hcHBlbmQoVUludDY0KDQzKSkKICAgIHB1c2hpbnQgNDMKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZHVwMgogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTozMgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MzMKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MzQKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gNDIKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MzYKICAgIC8vIGFkZF94KGFyciwgVUludDY0KDEwKSkKICAgIGR1cAogICAgcHVzaGludCAxMAogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MzcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCAxNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MzgKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDkKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDkKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQwCiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0CiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQxCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBkdXAKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjQyCiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0NAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjI3MgogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoOTkpKQogICAgcHVzaGludCA5OQogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToyNzMKICAgIC8vIGFycjIuYXBwZW5kKFVJbnQ2NCgxMDApKQogICAgcHVzaGludCAxMDAKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDQKICAgIC8vIHJldHVybl9yZWYoYXJyLCBhcnIpWzBdICs9IDIKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0NQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMTcKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDE3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0NAogICAgZGlnIDEKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDcKICAgIC8vIGFzc2VydCBhcnJbLTJdID09IDk5CiAgICBkdXAKICAgIHB1c2hpbnQgMgogICAgLQogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGRpZyAyCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA5OQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NDgKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDEwMAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAxMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfZXh0ZW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9leHRlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1MgogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1MwogICAgLy8gYWRkX3goYXJyLCBVSW50NjQoMSkpCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo1OQogICAgLy8gYXJyLmV4dGVuZChhcnIyKQogICAgZHVwCiAgICBsb2FkcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTcKICAgIC8vIGFycjIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTkKICAgIC8vIGFyci5leHRlbmQoYXJyMikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgZGlnIDEKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NjAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDQKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV9tdWx0aXBsZV9hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FycmF5X211bHRpcGxlX2FwcGVuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY0CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICBieXRlY18wIC8vIDB4CiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY1CiAgICAvLyBhZGRfeChhcnIsIFVJbnQ2NCgxKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY2CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgxKSkKICAgIGR1cAogICAgbG9hZHMKICAgIGludGNfMCAvLyAxCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjY3CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgyKSkKICAgIHB1c2hpbnQgMgogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo2OAogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoMykpCiAgICBwdXNoaW50IDMKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgZGlnIDEKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NjkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDQKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV90b29fbG9uZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJyYXlfdG9vX2xvbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo3NwogICAgLy8gYXJyYXkgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNTEyKToKICAgIGludGNfMiAvLyAwCgp0ZXN0X2FycmF5X3Rvb19sb25nX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNTEyKToKICAgIGR1cAogICAgaW50YyA0IC8vIDUxMgogICAgPAogICAgYnogdGVzdF9hcnJheV90b29fbG9uZ19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NzkKICAgIC8vIGFycmF5LmFwcGVuZChpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6NzgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1MTIpOgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X3Rvb19sb25nX2Zvcl9oZWFkZXJAMgoKdGVzdF9hcnJheV90b29fbG9uZ19hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4MAogICAgLy8gYXNzZXJ0IGFycmF5Lmxlbmd0aCA9PSA1MTIsICJhcnJheSBpcyBleHBlY3RlZCBsZW5ndGgiCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGludGMgNCAvLyA1MTIKICAgID09CiAgICBhc3NlcnQgLy8gYXJyYXkgaXMgZXhwZWN0ZWQgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4MgogICAgLy8gYXJyYXkuYXBwZW5kKFVJbnQ2NCg1MTIpKSAgIyB0aGlzIHdpbGwgZmFpbAogICAgaW50YyA0IC8vIDUxMgogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NgogICAgLy8gYXJyYXkgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5Ojg3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hcnJheV9jb3B5X2FuZF9leHRlbmRfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4OAogICAgLy8gYXJyYXkuYXBwZW5kKGkpCiAgICBkdXAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo4NwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FycmF5X2NvcHlfYW5kX2V4dGVuZF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfY29weV9hbmRfZXh0ZW5kX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTEKICAgIC8vIGFycmF5LmFwcGVuZChVSW50NjQoNSkpCiAgICBpbnRjXzMgLy8gNQogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5MgogICAgLy8gYXNzZXJ0IGFycmF5Lmxlbmd0aCA9PSA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5MwogICAgLy8gYXNzZXJ0IGFycmF5Wy0xXSA9PSA1LCAiZXhwZWN0ZWQgNSIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCA1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTUKICAgIC8vIGFzc2VydCBhcnJheTIubGVuZ3RoID09IDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgZHVwCiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTYKICAgIC8vIGFzc2VydCBhcnJheTJbLTFdID09IDQsICJleHBlY3RlZCA0IgogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weTo5OAogICAgLy8gYXJyYXkuZXh0ZW5kKGFycmF5MikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6OTkKICAgIC8vIGFzc2VydCBhcnJheS5sZW5ndGggPT0gMTEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDExCiAgICA9PQogICAgYXNzZXJ0CiAgICB1bmNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwMAogICAgLy8gYXNzZXJ0IGFycmF5Mi5sZW5ndGggPT0gNQogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18zIC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwMQogICAgLy8gYXNzZXJ0IGFycmF5Wy0xXSA9PSA0LCAiZXhwZWN0ZWQgNCIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTAyCiAgICAvLyBhc3NlcnQgYXJyYXlbNF0gPT0gNCwgImV4cGVjdGVkIDQiCiAgICBkdXAKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTAzCiAgICAvLyBhc3NlcnQgYXJyYXlbNV0gPT0gNSwgImV4cGVjdGVkIDQiCiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gNQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMDQKICAgIC8vIGFzc2VydCBhcnJheVs2XSA9PSAwLCAiZXhwZWN0ZWQgNCIKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9hcnJheV9ldmFsdWF0aW9uX29yZGVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9ldmFsdWF0aW9uX29yZGVyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTA4CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTA5CiAgICAvLyBhcnIuYXBwZW5kKFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMwogICAgaXRvYgogICAgZGlnIDEKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTEwCiAgICAvLyBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4oYXJyKS5leHRlbmQoYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycikpCiAgICBkdXAKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBkaWcgMQogICAgY2FsbHN1YiBhcHBlbmRfbGVuZ3RoX2FuZF9yZXR1cm4KICAgIGxvYWRzCiAgICBkaWcgMQogICAgbG9hZHMKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTIKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMwogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyWzFdID09IDEKICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTE0CiAgICAvLyBhc3NlcnQgYXJyWzJdID09IDIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTE1CiAgICAvLyBhc3NlcnQgYXJyWzNdID09IDMKICAgIGR1cAogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTE2CiAgICAvLyBhc3NlcnQgYXJyWzRdID09IDEKICAgIGR1cAogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMTcKICAgIC8vIGFzc2VydCBhcnJbNV0gPT0gMgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTE5CiAgICAvLyBhcnJbYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycilbMF1dID0gYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycilbLTFdCiAgICBkdXAKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBsb2FkcwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFwcGVuZF9sZW5ndGhfYW5kX3JldHVybgogICAgbG9hZHMKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGxvYWRzCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyMAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gOAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIxCiAgICAvLyBhc3NlcnQgYXJyWzZdID09IDYKICAgIGR1cAogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIyCiAgICAvLyBhc3NlcnQgYXJyWzddID09IDcKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTIzCiAgICAvLyBhc3NlcnQgYXJyWzNdID09IDYKICAgIHB1c2hpbnQgMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X2FycmF5X2Fzc2lnbm1lbnRfbWF4aW11bV9jdXJzYWdlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9hc3NpZ25tZW50X21heGltdW1fY3Vyc2FnZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyNwogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyOAogICAgLy8gYXJyLmFwcGVuZChVSW50NjQoMykpCiAgICBwdXNoaW50IDMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEyOQogICAgLy8gYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuKGFycilbMF0gPSBVSW50NjQoNDIpCiAgICBkdXAKICAgIGNhbGxzdWIgYXBwZW5kX2xlbmd0aF9hbmRfcmV0dXJuCiAgICBwdXNoaW50IDQyCiAgICBpdG9iCiAgICBkaWcgMQogICAgbG9hZHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzMAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMgogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gNDIKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzIKICAgIC8vIGFzc2VydCBhcnJbMV0gPT0gMQogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMudWludDY0LkNvbnRyYWN0LnRlc3RfYWxsb2NhdGlvbnNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FsbG9jYXRpb25zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG51bSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9hbGxvY2F0aW9uc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzYKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UobnVtKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYWxsb2NhdGlvbnNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjEzNwogICAgLy8gYWxsb2NfdGVzdCA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM4CiAgICAvLyBhZGRfeChhbGxvY190ZXN0LCBVSW50NjQoMSkpCiAgICBpbnRjXzAgLy8gMQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTM2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG51bSk6CiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hbGxvY2F0aW9uc19mb3JfaGVhZGVyQDIKCnRlc3RfYWxsb2NhdGlvbnNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy51aW50NjQuQ29udHJhY3QudGVzdF9pdGVyYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2l0ZXJhdGlvbjoKICAgIGludGNfMiAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0MgogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgpCiAgICBkdXBuIDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0MwogICAgLy8gZm9yIHZhbCBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzIgLy8gMAoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQzCiAgICAvLyBmb3IgdmFsIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgaW50Y18zIC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDQKICAgIC8vIGFyci5hcHBlbmQodmFsKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQzCiAgICAvLyBmb3IgdmFsIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JANToKICAgIGRpZyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNDUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUsICJleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggNSIKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGR1cAogICAgYnVyeSAxMAogICAgaW50Y18zIC8vIDUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXkgb2YgbGVuZ3RoIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0Ny0xNDgKICAgIC8vICMgaXRlcmF0ZQogICAgLy8gbGFzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNAogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQ5CiAgICAvLyBmb3IgdmFsdWUgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAOQogICAgZGlnIDEKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTUwCiAgICAvLyBhc3NlcnQgdmFsdWUgPj0gbGFzdCwgImFycmF5IGlzIG5vdCBzb3J0ZWQiCiAgICBkdXAKICAgIGRpZyA2CiAgICA+PQogICAgYXNzZXJ0IC8vIGFycmF5IGlzIG5vdCBzb3J0ZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDYKICAgIGJ1cnkgNAogICAgYiB0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDYKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckA5OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1My0xNTQKICAgIC8vICMgZW51bWVyYXRlCiAgICAvLyBmb3IgaWR4LCB2YWx1ZSBpbiB1ZW51bWVyYXRlKGFycik6CiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBidXJ5IDgKICAgIGludGNfMiAvLyAwCiAgICBidXJ5IDYKCnRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTMtMTU0CiAgICAvLyAjIGVudW1lcmF0ZQogICAgLy8gZm9yIGlkeCwgdmFsdWUgaW4gdWVudW1lcmF0ZShhcnIpOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGlkeCwgImluY29ycmVjdCBhcnJheSB2YWx1ZSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGluY29ycmVjdCBhcnJheSB2YWx1ZQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgNgogICAgYiB0ZXN0X2l0ZXJhdGlvbl9mb3JfaGVhZGVyQDEwCgp0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTM6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTU3LTE1OAogICAgLy8gIyByZXZlcnNlCiAgICAvLyBmb3IgdmFsdWUgaW4gcmV2ZXJzZWQoYXJyKToKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGJ1cnkgMwoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE1Ny0xNTgKICAgIC8vICMgcmV2ZXJzZQogICAgLy8gZm9yIHZhbHVlIGluIHJldmVyc2VkKGFycik6CiAgICBkaWcgMgogICAgYnogdGVzdF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDE3CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgYnVyeSA0CiAgICBkaWcgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNTkKICAgIC8vIGFzc2VydCB2YWx1ZSA8PSBsYXN0LCAiYXJyYXkgaXMgbm90IHNvcnRlZCIKICAgIGR1cAogICAgZGlnIDUKICAgIDw9CiAgICBhc3NlcnQgLy8gYXJyYXkgaXMgbm90IHNvcnRlZAogICAgYnVyeSA0CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTQKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2MgogICAgLy8gYXJjNF9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgYnVyeSAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTQyCiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGJ1cnkgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNwoKdGVzdF9pdGVyYXRpb25fZm9yX2hlYWRlckAxODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZGlnIDYKICAgIGludGNfMyAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2l0ZXJhdGlvbl9hZnRlcl9mb3JAMjEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NQogICAgLy8gYXJjNF9hcnIuYXBwZW5kKGFyYzQuVUludDY0KGkpKQogICAgZGlnIDYKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIGRpZyAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY2CiAgICAvLyBuYXRpdmVfYXJyLmFwcGVuZChhcmM0LlVJbnQ2NChpKSkKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY0CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSA3CiAgICBiIHRlc3RfaXRlcmF0aW9uX2Zvcl9oZWFkZXJAMTgKCnRlc3RfaXRlcmF0aW9uX2FmdGVyX2ZvckAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE2NwogICAgLy8gY29tYmluZWRfYXJyID0gYXJjNF9hcnIgKyBuYXRpdmVfYXJyCiAgICBkaWcgMTAKICAgIGRpZyAxMAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY4CiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyLmxlbmd0aCA9PSAxMAogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTY5CiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzBdID09IDAKICAgIGR1cAogICAgZXh0cmFjdCAyIDgKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTcwCiAgICAvLyBhc3NlcnQgY29tYmluZWRfYXJyWzRdID09IDQKICAgIGR1cAogICAgZXh0cmFjdCAzNCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGNvbWJpbmVkX2Fycls1XSA9PSAwCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgOAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzIKICAgIC8vIGFzc2VydCBjb21iaW5lZF9hcnJbOV0gPT0gNAogICAgZXh0cmFjdCA3NCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3F1aWNrc29ydFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcXVpY2tzb3J0OgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxNzYtMTc3CiAgICAvLyAjIGNyZWF0ZSBwc2V1ZG8gcmFuZG9tIGFycmF5IGZyb20gc2VuZGVyIGFkZHJlc3MKICAgIC8vIHJuZCA9IFJlZmVyZW5jZUFycmF5W1VJbnQ2NF0oKQogICAgY2FsbHN1YiBfcHV5YV9saWIubWVtLm5ld19zbG90CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTc4CiAgICAvLyBmb3IgYiBpbiBUeG4uc2VuZGVyLmJ5dGVzOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18yIC8vIDAKCnRlc3RfcXVpY2tzb3J0X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OAogICAgLy8gZm9yIGIgaW4gVHhuLnNlbmRlci5ieXRlczoKICAgIGR1cAogICAgcHVzaGludCAzMgogICAgPAogICAgYnogdGVzdF9xdWlja3NvcnRfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3OQogICAgLy8gcm5kLmFwcGVuZChvcC5idG9pKGIpKQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRieXRlCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsb2FkcwogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzdG9yZXMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckAyCgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4MAogICAgLy8gYXNzZXJ0IHJuZC5sZW5ndGggPT0gMzIsICJleHBlY3RlZCBhcnJheSBvZiBsZW5ndGggMzIiCiAgICBkaWcgMgogICAgZHVwCiAgICBsb2FkcwogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgZHVwCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5IG9mIGxlbmd0aCAzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTgyLTE4MwogICAgLy8gIyBzb3J0IHRoZSBhcnJheQogICAgLy8gcXVpY2tzb3J0X3dpbmRvdyhybmQsIFVJbnQ2NCgwKSwgcm5kLmxlbmd0aCAtIDEpCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgcXVpY2tzb3J0X3dpbmRvdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg1LTE4NgogICAgLy8gIyBhcnJheSBzaG91bGQgbm93IGJlIGluIGFzY2VuZGluZyBvcmRlcgogICAgLy8gbGFzdCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgbG9hZHMKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGJ1cnkgNgogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTg3CiAgICAvLyBmb3IgdmFsdWUgaW4gcm5kOgogICAgZGlnIDQKICAgIGRpZyA2CiAgICA8CiAgICBieiB0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOQogICAgZGlnIDIKICAgIGxvYWRzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE4OAogICAgLy8gYXNzZXJ0IHZhbHVlID49IGxhc3QsICJhcnJheSBpcyBub3Qgc29ydGVkIgogICAgZHVwCiAgICBkaWcgNgogICAgPj0KICAgIGFzc2VydCAvLyBhcnJheSBpcyBub3Qgc29ydGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBidXJ5IDQKICAgIGIgdGVzdF9xdWlja3NvcnRfZm9yX2hlYWRlckA2Cgp0ZXN0X3F1aWNrc29ydF9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnVpbnQ2NC5Db250cmFjdC50ZXN0X3Vub2JzZXJ2ZWRfd3JpdGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3Vub2JzZXJ2ZWRfd3JpdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTMKICAgIC8vIGFyciA9IGNyZWF0ZV9hcnJheSgpCiAgICBjYWxsc3ViIGNyZWF0ZV9hcnJheQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk0CiAgICAvLyBsYXN0ID0gYXJyLmxlbmd0aCAtIDEKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvdWludDY0LnB5OjE5NQogICAgLy8gYXJyW2xhc3RdID0gVUludDY0KDApICAjIHdyaXRlCiAgICBpbnRjXzIgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgc3dhcAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTYKICAgIC8vIGFzc2VydF9sYXN0X2lzX3plcm8oYXJyKQogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X2xhc3RfaXNfemVybwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy91aW50NjQucHk6MTk3CiAgICAvLyBhcnJbbGFzdF0gPSBVSW50NjQoMSkgICMgd3JpdGUKICAgIGludGNfMCAvLyAxCiAgICBpdG9iCiAgICBkaWcgMgogICAgbG9hZHMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTgKICAgIC8vIGFzc2VydCBhcnJbbGFzdF0gPT0gMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3VpbnQ2NC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLm1lbS5uZXdfc2xvdCgpIC0+IHVpbnQ2NDoKX3B1eWFfbGliLm1lbS5uZXdfc2xvdDoKICAgIGxvYWQgMAogICAgYml0bGVuCiAgICBsb2FkIDAKICAgIHB1c2hpbnQgMjU2CiAgICBkaWcgMgogICAgLQogICAgaW50Y18yIC8vIDAKICAgIHNldGJpdCAvLyBvbiBlcnJvcjogbm8gYXZhaWxhYmxlIHNsb3RzCiAgICBzdG9yZSAwCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAFCAEABYAEJgQAGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwgAAAAAAAAAAAgAAAAAAAAABIAgf/////////////////////////////////////////81ADEbQQBlMRkURDEYRIIMBKM76HME4MN46QQ2b1CdBFg1GlAE+pnphASiDkQPBBeaw/kERdzINgTxf28KBIReG04EdiHP0QRWYaZ8NhoAjgwBSgJQAmwAAQKPArgDMwPEA/EEEQUWBYUAI0MxGRQxGBQQRCNDigMAKEmL/ov/CIECCov9PkwiC1uL/4v+i/0+iwQiC0mMAFuLAgxBAAmLBCMIjARC/+aL/T6LAyILSYwBW4sCDUEAMYsDQQAJiwMjCYwDQv/hi/6LAwxBAAmL/Yv+iwOI/56LBIv/DEEACYv9iwSL/4j/jYmLBIsDDEEAOYv9PkmLAUlOAyJYSwGLAElOAyJYTgNdTgJdi/1MP4sEIwiMBIsDQf+siwMjCUmMA4sED0D/ZkL/nIsEiwMSQf+UiwQjCIwEiwNB/4mLAyMJjANC/4CKAAGIBNVJKD8kiwElDEEAE4sAST6LAUlOAxZQPyMIjAFC/+aJigEAi/8+SRUiCiMJIgtbFESJigIAJIsAi/8MQQAVi/4+iwBJTgIWUIv+TD8jCIwAQv/jiYoBAYv/PkkVIgoWUIv/TD+L/4mIBGxJgSoWSwFMP0kliP+7PkkVIgpJgQYSRCMJIgtbgQQSRIEEJEmBAwxBAC1LAkk+SRVJIglLAiRLAlhPA08CTwNSF04CP0sCSU4CEkQjCUUCSSMIRQFC/8xLAkk+SRUiCkmBAxJEIwkiC0sBTFsjEkSBKxZQSj9JFSIKSYEEEkQjCSILSwFMW4ErEkQkW4EqEkRJgQqI/zJJPkkVIgpJgQ4SRCMJIgtLAUxbgQkSRIEsFlBJFSIKSYEPEkQjCSILSwFMW4EsEkSBYxZQgWQWUEkkW4ECCBZcAExLAT9JFSIKSYEREkRLASRbgSwSREmBAgkiC0sCTFuBYxJEIwkiC1uBZBJDiANmSSg/SSOI/ropSEk+KVBMSwE/FSIKgQQSQ4gDSkkoP0kjiP6eST4jFlCBAhZQgQMWUExLAT8VIgqBBBJDKCRJIQQMQQAPSklOAhZQRQMjCEUBQv/qSwFJFSIKIQQSRCEEFlBII0MoJEklDEEAD0pJTgIWUEUDIwhFAUL/60sBSSUWUEkVIgpJgQYSRCMJIgtLAUxbJRJESwFJFSIKSSUSRCMJIgtLAUxbgQQSRFBJFSIKSYELEkRPAhUiCiUSRCMJIgtLAUxbgQQSREmBIFuBBBJESYEoWyUSRIEwWxREI0OIAoOBAxZLAUw/SYj99ksBiP3xPksBPkxQP0k+SRUiCoEGEkRJJFuBAxJESSJbIxJESYEQW4ECEkRJgRhbgQMSREmBIFsjEkSBKFuBAhJESYj9sT5JFSIKIwkiCyJYSwGI/aE+JFtLAj5MIgtPAl1MSwE/SRUiCiISREmBMFuBBhJESYE4W4EHEkSBGFuBBhJDiAHygQMWSwFMP0mI/WWBKhZLAT5MXAA/PkkVIgqBAhJESSRbgSoSRCJbIxJDNhoBFyRJSwIMQQASiAG5SSg/I4j9DkkjCEUBQv/nI0MkSShHByRJJQxBAA9KSU4CFlBFAyMIRQFC/+tLARUiCklFCiUSRCRFBCRFBUsESwkMQQAZSwFLBUlOAiILW0lLBg9ETCMIRQZFBEL/30sBFSIKRQgkRQZLBUsIDEEAFUsBSwZJTgIiC1tLARJEIwhFBkL/40sBFSIKRQNLAkEAF0sCIwlJRQRLAkwiC1tJSwUOREUEQv/kgAIAAEULKEUKJEUHSwYlDEEAJ0sGSRZLDElOAksBUE8CJFkjCBZXBgJcAEUNSwtMUEULIwhFB0L/0ksKSwpQSVcCABUiChZXBgJcAEkkWYEKEkRJVwIIKqhESVciCCuoRElXKggqqERXSggrqEMoRwKIAJ1JKD8xACRJgSAMQQAWSklOAlVLBElOAj5MFlA/IwhFAUL/40sCST4VIgpJgSASRCMJSwEkTwKI+rgkRQU+FSIKRQYkRQVLBEsGDEEAGksCPksFSU4CIgtbSUsGD0RMIwhFBkUEQv/eI0OI+1ZJPkkVIgojCSQWTCILTwJLAU8DXUsCTD9LAYj7XiMWSwI+SwJPAl1PAksBP0xbIxJDNACTNACBgAJLAgkkVDUAiQ==", + "approval": "CyAFAQgABYAEJgMACAAAAAAAAAAACAAAAAAAAAAEgCB//////////////////////////////////////////zUAMRtBAGUxGRREMRhEggwEozvocwTgw3jpBDZvUJ0EWDUaUAT6memEBKIORA8EF5rD+QRF3Mg2BPF/bwoEhF4bTgR2Ic/RBFZhpnw2GgCODAFIAlAChQABAqoC0wNOA+EEEAQwBTcFpgAiQzEZFDEYFBBDigMAKEmL/ov/CIECCov9PkwjC1uL/4v+i/0+iwQjC0mMAFuLAgxBAAmLBCIIjARC/+aL/T6LAyMLSYwBW4sCDUEAMYsDQQAJiwMiCYwDQv/hi/6LAwxBAAmL/Yv+iwOI/56LBIv/DEEACYv9iwSL/4j/jYmLBIsDDEEAOYv9PkmLAUlOAyNYSwGLAElOAyNYTgNdTgJdi/1MP4sEIgiMBIsDQf+siwMiCUmMA4sED0D/ZkL/nIsEiwMSQf+UiwQiCIwEiwNB/4mLAyIJjANC/4CKAAGIBPpJKD8kiwElDEEAE4sAST6LAUlOAxZQPyIIjAFC/+aJigEAi/8+SRUjCiIJIwtbFESJigIAJIsAi/8MQQAVi/4+iwBJTgIWUIv+TD8iCIwAQv/jiYoBAYv/PkkVIwoWUIv/TD+L/4mIBJFJgSoWSwFMP0kliP+7PkkVIwpJgQYSRCIJIwtbgQQSRIEEJEmBAwxBAC1LAkk+SRVJIwlLAiRLAlhPA08CTwNSF04CP0sCSU4CEkQiCUUCSSIIRQFC/8xLAkk+SRUjCkmBAxJEIgkjC0sBTFsiEkSBKxZQSj9JFSMKSYEEEkQiCSMLSwFMW4ErEkQkW4EqEkRJgQqI/zJJPkkVIwpJgQ4SRCIJIwtLAUxbgQkSRIEsFlBJFSMKSYEPEkQiCSMLSwFMW4EsEkSBYxZQgWQWUEkkW4ECCBZcAExLAT9JFSMKSYEREkRLASRbgSwSREmBAgkjC0sCTFuBYxJEIgkjC1uBZBJEIkOIA4lJKD9JIoj+uEk+gBgAAAAAAAAAAQAAAAAAAAACAAAAAAAAAANQTEsBPxUjCoEEEkQiQ4gDVEkoP0kiiP6DST4iFlCBAhZQgQMWUExLAT8VIwqBBBJEIkMoJEkhBAxBAA9KSU4CFlBFAyIIRQFC/+pLAUkVIwohBBJEIQQWUEgiQygkSSUMQQAPSklOAhZQRQMiCEUBQv/rSwFJJRZQSRUjCkmBBhJEIgkjC0sBTFslEkRLAUkVIwpJJRJEIgkjC0sBTFuBBBJEUEkVIwpJgQsSRE8CFSMKJRJEIgkjC0sBTFuBBBJESYEgW4EEEkRJgShbJRJEgTBbFEQiQ4gCi4EDFksBTD9JiP3ZSwGI/dQ+SwE+TFA/ST5JFSMKgQYSREkkW4EDEkRJI1siEkRJgRBbgQISREmBGFuBAxJESYEgWyISRIEoW4ECEkRJiP2UPkkVIwoiCSMLI1hLAYj9hD4kW0sCPkwjC08CXUxLAT9JFSMKIxJESYEwW4EGEkRJgThbgQcSRIEYW4EGEkQiQ4gB+IEDFksBTD9JiP1GgSoWSwE+TFwAPz5JFSMKgQISREkkW4EqEkQjWyISRCJDNhoBFyRJSwIMQQASiAG9SSg/Ioj87UkiCEUBQv/nIkMkSShHByRJJQxBAA9KSU4CFlBFAyIIRQFC/+tLARUjCklFCiUSRCRFBCRFBUsESwkMQQAZSwFLBUlOAiMLW0lLBg9ETCIIRQZFBEL/30sBFSMKRQgkRQZLBUsIDEEAFUsBSwZJTgIjC1tLARJEIghFBkL/40sBFSMKRQNLAkEAF0sCIglJRQRLAkwjC1tJSwUOREUEQv/kgAIAAEULKEUKJEUHSwYlDEEAJ0sGSRZLDElOAksBUE8CJFkiCBZXBgJcAEUNSwtMUEULIghFB0L/0ksKSwpQSVcCABUjChZXBgJcAEkkWYEKEkRJVwIIKahESVciCCqoRElXKggpqERXSggqqEQiQyhHAogAn0koPzEAJEmBIAxBABZKSU4CVUsESU4CPkwWUD8iCEUBQv/jSwJJPhUjCkmBIBJEIglLASRPAoj6lSRFBT4VIwpFBiRFBUsESwYMQQAaSwI+SwVJTgIjC1tJSwYPREwiCEUGRQRC/94iQ4j7M0k+SRUjCiIJJBZMIwtPAksBTwNdSwJMP0sBiPs7IhZLAj5LAk8CXU8CSwE/TFsiEkQiQzQAkzQAgYACSwIJJFQ1AIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/Arrays/data/Contract.clear.teal b/tests/artifacts/Arrays/data/Contract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Arrays/data/Contract.clear.teal +++ b/tests/artifacts/Arrays/data/Contract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal b/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal index 09ddd805..f209ad14 100644 --- a/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal @@ -3,7 +3,7 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: - intcblock 8 3 1 0 + intcblock 1 8 3 0 bytecblock 0x000000000000000100000000000000020000000000000003 // tests/artifacts/Arrays/immutable.py:480 // class DynamicArrayInitContract(arc4.ARC4Contract): @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@11 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x8434ba2a 0x63aabba0 0xdbaf034e 0xa9d14554 // method "test_immutable_array_init()void", method "test_immutable_array_init_without_type_generic()void", method "test_reference_array_init()void", method "test_reference_array_init_without_type_generic()void" @@ -25,32 +25,22 @@ main___algopy_default_create@11: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_2 // 1 return // tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_immutable_array_init[routing]() -> void: test_immutable_array_init: - // tests/artifacts/Arrays/immutable.py:491 - // a3 = ImmutableArray[UInt64](ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop // tests/artifacts/Arrays/immutable.py:481 // @arc4.abimethod() - intc_2 // 1 + intc_0 // 1 return // tests.artifacts.Arrays.immutable.DynamicArrayInitContract.test_immutable_array_init_without_type_generic[routing]() -> void: test_immutable_array_init_without_type_generic: - // tests/artifacts/Arrays/immutable.py:513 - // a3 = ImmutableArray(ReferenceArray((UInt64(1), UInt64(2), UInt64(3)))) - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop // tests/artifacts/Arrays/immutable.py:503 // @arc4.abimethod() - intc_2 // 1 + intc_0 // 1 return @@ -59,17 +49,13 @@ test_reference_array_init: // tests/artifacts/Arrays/immutable.py:527 // a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) bytec_0 // 0x000000000000000100000000000000020000000000000003 - // tests/artifacts/Arrays/immutable.py:529 - // a2 = ReferenceArray[UInt64](FixedArray((UInt64(1), UInt64(2), UInt64(3)))) - dup - pop - dupn 2 // tests/artifacts/Arrays/immutable.py:530 // assert a1.length == a2.length + dupn 2 len - intc_0 // 8 + intc_1 // 8 / - intc_1 // 3 + intc_2 // 3 == assert // tests/artifacts/Arrays/immutable.py:531 @@ -77,64 +63,54 @@ test_reference_array_init: dup intc_3 // 0 extract_uint64 - intc_2 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/immutable.py:532 // assert a1[1] == a2[1] dup - intc_0 // 8 + intc_1 // 8 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/immutable.py:533 // assert a1[2] == a2[2] - pushint 16 // 16 + pushint 16 extract_uint64 - intc_1 // 3 + intc_2 // 3 == assert - // tests/artifacts/Arrays/immutable.py:535 - // a3 = ReferenceArray[UInt64](ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop dupn 2 // tests/artifacts/Arrays/immutable.py:537 // assert a1[0] == a3[0] intc_3 // 0 extract_uint64 - intc_2 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/immutable.py:538 // assert a1[1] == a3[1] dup - intc_0 // 8 + intc_1 // 8 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/immutable.py:539 // assert a1[2] == a3[2] - pushint 16 // 16 + pushint 16 extract_uint64 - intc_1 // 3 + intc_2 // 3 == assert - // tests/artifacts/Arrays/immutable.py:527 - // a1 = ReferenceArray[UInt64]((UInt64(1), UInt64(2), UInt64(3))) - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop // tests/artifacts/Arrays/immutable.py:542 // assert a1.length == a4.length dup len - intc_0 // 8 + intc_1 // 8 / - intc_1 // 3 + intc_2 // 3 == assert // tests/artifacts/Arrays/immutable.py:543 @@ -142,25 +118,27 @@ test_reference_array_init: dup intc_3 // 0 extract_uint64 - intc_2 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/immutable.py:544 // assert a1[1] == a4[1] dup - intc_0 // 8 + intc_1 // 8 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/immutable.py:545 // assert a1[2] == a4[2] - pushint 16 // 16 + pushint 16 extract_uint64 - intc_1 // 3 + intc_2 // 3 == + assert // tests/artifacts/Arrays/immutable.py:525 // @arc4.abimethod() + intc_0 // 1 return @@ -169,17 +147,13 @@ test_reference_array_init_without_type_generic: // tests/artifacts/Arrays/immutable.py:549 // a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) bytec_0 // 0x000000000000000100000000000000020000000000000003 - // tests/artifacts/Arrays/immutable.py:551 - // a2 = ReferenceArray(FixedArray((UInt64(1), UInt64(2), UInt64(3)))) - dup - pop - dupn 2 // tests/artifacts/Arrays/immutable.py:552 // assert a1.length == a2.length + dupn 2 len - intc_0 // 8 + intc_1 // 8 / - intc_1 // 3 + intc_2 // 3 == assert // tests/artifacts/Arrays/immutable.py:553 @@ -187,64 +161,54 @@ test_reference_array_init_without_type_generic: dup intc_3 // 0 extract_uint64 - intc_2 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/immutable.py:554 // assert a1[1] == a2[1] dup - intc_0 // 8 + intc_1 // 8 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/immutable.py:555 // assert a1[2] == a2[2] - pushint 16 // 16 + pushint 16 extract_uint64 - intc_1 // 3 + intc_2 // 3 == assert - // tests/artifacts/Arrays/immutable.py:557 - // a3 = ReferenceArray(ImmutableArray((UInt64(1), UInt64(2), UInt64(3)))) - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop dupn 2 // tests/artifacts/Arrays/immutable.py:559 // assert a1[0] == a3[0] intc_3 // 0 extract_uint64 - intc_2 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/immutable.py:560 // assert a1[1] == a3[1] dup - intc_0 // 8 + intc_1 // 8 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/immutable.py:561 // assert a1[2] == a3[2] - pushint 16 // 16 + pushint 16 extract_uint64 - intc_1 // 3 + intc_2 // 3 == assert - // tests/artifacts/Arrays/immutable.py:549 - // a1 = ReferenceArray((UInt64(1), UInt64(2), UInt64(3))) - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop - bytec_0 // 0x000000000000000100000000000000020000000000000003 - pop // tests/artifacts/Arrays/immutable.py:564 // assert a1.length == a4.length dup len - intc_0 // 8 + intc_1 // 8 / - intc_1 // 3 + intc_2 // 3 == assert // tests/artifacts/Arrays/immutable.py:565 @@ -252,23 +216,25 @@ test_reference_array_init_without_type_generic: dup intc_3 // 0 extract_uint64 - intc_2 // 1 + intc_0 // 1 == assert // tests/artifacts/Arrays/immutable.py:566 // assert a1[1] == a4[1] dup - intc_0 // 8 + intc_1 // 8 extract_uint64 - pushint 2 // 2 + pushint 2 == assert // tests/artifacts/Arrays/immutable.py:567 // assert a1[2] == a4[2] - pushint 16 // 16 + pushint 16 extract_uint64 - intc_1 // 3 + intc_2 // 3 == + assert // tests/artifacts/Arrays/immutable.py:547 // @arc4.abimethod() + intc_0 // 1 return diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json index 821869c9..81a9d90a 100644 --- a/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json @@ -102,20 +102,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 42 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 89 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -124,19 +111,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDMgMSAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4NDM0YmEyYSAweDYzYWFiYmEwIDB4ZGJhZjAzNGUgMHhhOWQxNDU1NCAvLyBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQoKXZvaWQiLCBtZXRob2QgInRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0IHRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWMgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdCB0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTE6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ5MQogICAgLy8gYTMgPSBJbW11dGFibGVBcnJheVtVSW50NjRdKFJlZmVyZW5jZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MTMKICAgIC8vIGEzID0gSW1tdXRhYmxlQXJyYXkoUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyOQogICAgLy8gYTIgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKEZpeGVkQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKSkKICAgIGR1cAogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgIC8KICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzEKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhMlswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzIKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhMlsxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzUKICAgIC8vIGEzID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzkKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MjcKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXlbVUludDY0XSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICAvCiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18wIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ1CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0OQogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NTEKICAgIC8vIGEyID0gUmVmZXJlbmNlQXJyYXkoRml4ZWRBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgZHVwCiAgICBwb3AKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1MwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NwogICAgLy8gYTMgPSBSZWZlcmVuY2VBcnJheShJbW11dGFibGVBcnJheSgoVUludDY0KDEpLCBVSW50NjQoMiksIFVJbnQ2NCgzKSkpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1OQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjAKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzAgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgcG9wCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhNC5sZW5ndGgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgLwogICAgaW50Y18xIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NQogICAgLy8gYXNzZXJ0IGExWzBdID09IGE0WzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NgogICAgLy8gYXNzZXJ0IGExWzFdID09IGE0WzFdCiAgICBkdXAKICAgIGludGNfMCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2NwogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDggMyAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODAKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUluaXRDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ODQzNGJhMmEgMHg2M2FhYmJhMCAweGRiYWYwMzRlIDB4YTlkMTQ1NTQgLy8gbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdCB0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljIHRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXQgdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpYwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDExOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9pbW11dGFibGVfYXJyYXlfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuRHluYW1pY0FycmF5SW5pdENvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcnJheV9pbml0X3dpdGhvdXRfdHlwZV9nZW5lcmljOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkR5bmFtaWNBcnJheUluaXRDb250cmFjdC50ZXN0X3JlZmVyZW5jZV9hcnJheV9pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNwogICAgLy8gYTEgPSBSZWZlcmVuY2VBcnJheVtVSW50NjRdKChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMAogICAgLy8gYXNzZXJ0IGExLmxlbmd0aCA9PSBhMi5sZW5ndGgKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMQogICAgLy8gYXNzZXJ0IGExWzBdID09IGEyWzBdCiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzMgogICAgLy8gYXNzZXJ0IGExWzFdID09IGEyWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzMKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhMlsyXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUzNwogICAgLy8gYXNzZXJ0IGExWzBdID09IGEzWzBdCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1MzgKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhM1sxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTM5CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTNbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGE0Lmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTRbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTRbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU0NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGE0WzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjUyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5EeW5hbWljQXJyYXlJbml0Q29udHJhY3QudGVzdF9yZWZlcmVuY2VfYXJyYXlfaW5pdF93aXRob3V0X3R5cGVfZ2VuZXJpY1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfcmVmZXJlbmNlX2FycmF5X2luaXRfd2l0aG91dF90eXBlX2dlbmVyaWM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NDkKICAgIC8vIGExID0gUmVmZXJlbmNlQXJyYXkoKFVJbnQ2NCgxKSwgVUludDY0KDIpLCBVSW50NjQoMykpKQogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUyCiAgICAvLyBhc3NlcnQgYTEubGVuZ3RoID09IGEyLmxlbmd0aAogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTUzCiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTJbMF0KICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU0CiAgICAvLyBhc3NlcnQgYTFbMV0gPT0gYTJbMV0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU1NQogICAgLy8gYXNzZXJ0IGExWzJdID09IGEyWzJdCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTU5CiAgICAvLyBhc3NlcnQgYTFbMF0gPT0gYTNbMF0KICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU2MAogICAgLy8gYXNzZXJ0IGExWzFdID09IGEzWzFdCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjEKICAgIC8vIGFzc2VydCBhMVsyXSA9PSBhM1syXQogICAgcHVzaGludCAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjQKICAgIC8vIGFzc2VydCBhMS5sZW5ndGggPT0gYTQubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjUKICAgIC8vIGFzc2VydCBhMVswXSA9PSBhNFswXQogICAgZHVwCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NjYKICAgIC8vIGFzc2VydCBhMVsxXSA9PSBhNFsxXQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTY3CiAgICAvLyBhc3NlcnQgYTFbMl0gPT0gYTRbMl0KICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAECAMBACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAALAA8AEwBlADEZFDEYFBBEJEMoSCRDKEgkQyhJSEcCFSIKIxJESSVbJBJESSJbgQISRIEQWyMSRChIRwIlWyQSREkiW4ECEkSBEFsjEkQoSChISRUiCiMSREklWyQSREkiW4ECEkSBEFsjEkMoSUhHAhUiCiMSREklWyQSREkiW4ECEkSBEFsjEkQoSEcCJVskEkRJIluBAhJEgRBbIxJEKEgoSEkVIgojEkRJJVskEkRJIluBAhJEgRBbIxJD", + "approval": "CyAEAQgDACYBGAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAzEbQQArMRkURDEYRIIEBIQ0uioEY6q7oATbrwNOBKnRRVQ2GgCOBAAJAAsADQBZADEZFDEYFBBDIkMiQyhHAhUjCiQSREklWyISREkjW4ECEkSBEFskEkRHAiVbIhJESSNbgQISRIEQWyQSREkVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJEIkMoRwIVIwokEkRJJVsiEkRJI1uBAhJEgRBbJBJERwIlWyISREkjW4ECEkSBEFskEkRJFSMKJBJESSVbIhJESSNbgQISRIEQWyQSRCJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal b/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal +++ b/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal b/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal index a73a0b23..ba8e12fe 100644 --- a/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal +++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@31 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x44d42f99 0xb7eaa60b 0x743d70ed 0x1c7e0494 0xa2d5860b 0xe05fc564 0x1e092b83 0x01310262 0xc8654a98 0x89d196f8 0x6cb7c991 0x9898bf02 0xf6b61ee8 0x60b86a7b 0x73ad283f 0x529dfae9 0x206d514f 0xe06465e2 0xec0300a2 0xecdf14af 0x511aca64 0x29852e4f 0x6d4aa358 0xb7cb96bd // method "test_uint64_array()void", method "test_biguint_array()void", method "test_bool_array(uint64)void", method "test_fixed_size_tuple_array()void", method "test_fixed_size_named_tuple_array()void", method "test_dynamic_sized_tuple_array()void", method "test_dynamic_sized_named_tuple_array()void", method "test_implicit_conversion_log(uint64[])void", method "test_implicit_conversion_emit(uint64[])void", method "test_nested_array(uint64,uint64[][])uint64[]", method "test_bit_packed_tuples()void", method "sum_uints_and_lengths_and_trues(uint64[],bool[],(uint64,bool,bool)[],(uint64,string)[])(uint64,uint64,uint64,uint64)", method "test_uint64_return(uint64)uint64[]", method "test_bool_return(uint64)bool[]", method "test_tuple_return(uint64)(uint64,bool,bool)[]", method "test_dynamic_tuple_return(uint64)(uint64,string)[]", method "test_convert_to_array_and_back((uint64,bool,bool)[],uint64)(uint64,bool,bool)[]", method "test_concat_with_arc4_tuple((uint64,uint64))uint64[]", method "test_concat_with_native_tuple((uint64,uint64))uint64[]", method "test_dynamic_concat_with_arc4_tuple((string,string))string[]", method "test_dynamic_concat_with_native_tuple((string,string))string[]", method "test_concat_immutable_dynamic((uint64,string)[],(uint64,string)[])(uint64,string)[]", method "test_immutable_arc4((uint64,uint64)[])(uint64,uint64)[]", method "test_imm_fixed_arr()(uint64,uint64)[3]" @@ -25,8 +25,6 @@ main___algopy_default_create@31: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_1 // 1 return @@ -148,13 +146,13 @@ dynamic_array_concat_bits: replace2 0 cover 2 swap - pushint 7 // 7 + pushint 7 + intc_3 // 8 / dup uncover 2 - pushint 7 // 7 + pushint 7 + intc_3 // 8 / @@ -175,7 +173,7 @@ dynamic_array_concat_bits_after_if_else@2: intc_0 // 0 frame_bury 0 frame_dig 3 - pushint 16 // 16 + pushint 16 + dup frame_bury 2 @@ -397,7 +395,7 @@ sum_imm_fixed_for_header@1: // tests/artifacts/Arrays/immutable.py:573 // for item in arr: frame_dig 1 - pushint 3 // 3 + pushint 3 < bz sum_imm_fixed_after_for@4 // tests/artifacts/Arrays/immutable.py:573-574 @@ -405,11 +403,11 @@ sum_imm_fixed_for_header@1: // total += item.foo frame_dig 1 dup - pushint 16 // 16 + pushint 16 * frame_dig -1 swap - pushint 16 // 16 + pushint 16 extract3 // on error: index access is out of bounds // tests/artifacts/Arrays/immutable.py:574 // total += item.foo @@ -537,7 +535,7 @@ test_uint64_array: pushbytes 0x0001000000000000002a // tests/artifacts/Arrays/immutable.py:103 // arr = add_x(arr, UInt64(5)) - pushint 5 // 5 + pushint 5 callsub add_x // tests/artifacts/Arrays/immutable.py:104 // assert arr.length == 6 @@ -545,7 +543,7 @@ test_uint64_array: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 6 // 6 + pushint 6 == assert // tests/artifacts/Arrays/immutable.py:105 @@ -559,12 +557,12 @@ test_uint64_array: intc_3 // 8 * extract_uint64 - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arrays/immutable.py:107 // arr = arr.append(UInt64(43)) - pushint 43 // 43 + pushint 43 itob uncover 2 swap @@ -581,7 +579,7 @@ test_uint64_array: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 7 // 7 + pushint 7 == assert // tests/artifacts/Arrays/immutable.py:109 @@ -594,14 +592,14 @@ test_uint64_array: intc_3 // 8 * extract_uint64 - pushint 43 // 43 + pushint 43 == assert intc_2 // 2 // tests/artifacts/Arrays/immutable.py:110 // assert arr[0] == 42 extract_uint64 - pushint 42 // 42 + pushint 42 == assert // tests/artifacts/Arrays/immutable.py:596 @@ -614,7 +612,7 @@ test_uint64_array_for_header@2: dup // tests/artifacts/Arrays/immutable.py:112 // arr = pop_x(arr, UInt64(3)) - pushint 3 // 3 + pushint 3 // tests/artifacts/Arrays/immutable.py:596 // for _i in urange(x): < @@ -642,7 +640,7 @@ test_uint64_array_after_for@4: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arrays/immutable.py:114 @@ -660,7 +658,7 @@ test_uint64_array_after_for@4: assert // tests/artifacts/Arrays/immutable.py:116 // arr = add_x(arr, UInt64(10)) - pushint 10 // 10 + pushint 10 callsub add_x // tests/artifacts/Arrays/immutable.py:117 // assert arr.length == 14 @@ -668,7 +666,7 @@ test_uint64_array_after_for@4: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 14 // 14 + pushint 14 == assert // tests/artifacts/Arrays/immutable.py:118 @@ -682,12 +680,12 @@ test_uint64_array_after_for@4: intc_3 // 8 * extract_uint64 - pushint 9 // 9 + pushint 9 == assert // tests/artifacts/Arrays/immutable.py:120 // arr = arr.append(UInt64(44)) - pushint 44 // 44 + pushint 44 itob uncover 2 swap @@ -704,7 +702,7 @@ test_uint64_array_after_for@4: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 15 // 15 + pushint 15 == assert // tests/artifacts/Arrays/immutable.py:122 @@ -717,12 +715,12 @@ test_uint64_array_after_for@4: intc_3 // 8 * extract_uint64 - pushint 44 // 44 + pushint 44 == assert // tests/artifacts/Arrays/immutable.py:124 // arr = arr.replace(2, UInt64(23)) - pushint 23 // 23 + pushint 23 itob replace2 18 // on error: index access is out of bounds // tests/artifacts/Arrays/immutable.py:125 @@ -730,15 +728,15 @@ test_uint64_array_after_for@4: dup intc_0 // 0 extract_uint16 // on error: invalid array length header - pushint 15 // 15 + pushint 15 == assert // tests/artifacts/Arrays/immutable.py:126 // assert arr[2] == 23 dup - pushint 18 // 18 + pushint 18 extract_uint64 - pushint 23 // 23 + pushint 23 == assert // tests/artifacts/Arrays/immutable.py:128 @@ -760,7 +758,7 @@ test_biguint_array: intc_1 // 1 - itob - pushint 64 // 64 + pushint 64 bzero dup cover 2 @@ -790,9 +788,9 @@ test_biguint_array: swap extract 2 0 swap - pushint 64 // 64 + pushint 64 * - pushint 64 // 64 + pushint 64 extract3 // on error: index access is out of bounds bytec_0 // 0x b== @@ -807,7 +805,7 @@ test_biguint_array_for_header@2: dup // tests/artifacts/Arrays/immutable.py:139 // arr = add_xb(arr, UInt64(5)) - pushint 5 // 5 + pushint 5 // tests/artifacts/Arrays/immutable.py:603 // for i in urange(x): < @@ -846,7 +844,7 @@ test_biguint_array_after_for@4: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 6 // 6 + pushint 6 == assert // tests/artifacts/Arrays/immutable.py:141 @@ -857,9 +855,9 @@ test_biguint_array_after_for@4: dig 2 extract 2 0 swap - pushint 64 // 64 + pushint 64 * - pushint 64 // 64 + pushint 64 extract3 // on error: index access is out of bounds pushbytes 0x04 b== @@ -873,7 +871,7 @@ test_biguint_array_after_for@4: b- dup len - pushint 64 // 64 + pushint 64 <= assert // overflow dig 5 @@ -893,7 +891,7 @@ test_biguint_array_after_for@4: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 7 // 7 + pushint 7 == assert // tests/artifacts/Arrays/immutable.py:145 @@ -904,9 +902,9 @@ test_biguint_array_after_for@4: dig 2 extract 2 0 swap - pushint 64 // 64 + pushint 64 * - pushint 64 // 64 + pushint 64 extract3 // on error: index access is out of bounds pushbytes 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe b== @@ -945,9 +943,9 @@ test_biguint_array_after_for@4: dig 1 extract 2 0 swap - pushint 64 // 64 + pushint 64 * - pushint 64 // 64 + pushint 64 extract3 // on error: index access is out of bounds bytec 5 // 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff b== @@ -1039,7 +1037,7 @@ test_bool_array_after_for@5: dig 3 assert // index access is out of bounds dig 1 - pushint 16 // 16 + pushint 16 getbit ! assert // expected element 0 to be False @@ -1058,7 +1056,7 @@ test_bool_array_after_if_else@7: < assert // index access is out of bounds dig 1 - pushint 17 // 17 + pushint 17 getbit ! assert // expected element 1 to be False @@ -1077,7 +1075,7 @@ test_bool_array_after_if_else@9: < assert // index access is out of bounds dig 1 - pushint 18 // 18 + pushint 18 getbit assert // expected element 2 to be True @@ -1085,7 +1083,7 @@ test_bool_array_after_if_else@11: // tests/artifacts/Arrays/immutable.py:172 // if length > 3: dig 2 - pushint 3 // 3 + pushint 3 > bz test_bool_array_after_if_else@13 // tests/artifacts/Arrays/immutable.py:173 @@ -1097,7 +1095,7 @@ test_bool_array_after_if_else@11: dig 5 < assert // index access is out of bounds - pushint 16 // 16 + pushint 16 + dig 2 swap @@ -1125,12 +1123,12 @@ test_bool_array_after_if_else@13: swap replace2 0 dig 1 - pushint 16 // 16 + pushint 16 + intc_0 // 0 setbit swap - pushint 7 // 7 + pushint 7 + intc_3 // 8 / @@ -1169,7 +1167,7 @@ test_fixed_size_tuple_array_for_header@2: // tests/artifacts/Arrays/immutable.py:185 // for i in urange(5): dup - pushint 5 // 5 + pushint 5 < bz test_fixed_size_tuple_array_after_for@5 // tests/artifacts/Arrays/immutable.py:186 @@ -1209,7 +1207,7 @@ test_fixed_size_tuple_array_after_for@5: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:189 @@ -1237,9 +1235,9 @@ test_fixed_size_tuple_array_after_for@5: swap intc_1 // 1 - - pushint 16 // 16 + pushint 16 * - pushint 16 // 16 + pushint 16 extract3 // on error: index access is out of bounds dup intc_0 // 0 @@ -1248,16 +1246,16 @@ test_fixed_size_tuple_array_after_for@5: intc_3 // 8 extract_uint64 swap - pushint 5 // 5 + pushint 5 == swap - pushint 6 // 6 + pushint 6 == && assert // tests/artifacts/Arrays/immutable.py:192 // arr = arr.pop() - pushint 16 // 16 + pushint 16 callsub dynamic_array_pop_fixed_size bury 1 // tests/artifacts/Arrays/immutable.py:193 @@ -1266,7 +1264,7 @@ test_fixed_size_tuple_array_after_for@5: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arrays/immutable.py:194 @@ -1294,9 +1292,9 @@ test_fixed_size_tuple_array_after_for@5: swap intc_1 // 1 - - pushint 16 // 16 + pushint 16 * - pushint 16 // 16 + pushint 16 extract3 // on error: index access is out of bounds dup intc_0 // 0 @@ -1305,10 +1303,10 @@ test_fixed_size_tuple_array_after_for@5: intc_3 // 8 extract_uint64 swap - pushint 4 // 4 + pushint 4 == swap - pushint 5 // 5 + pushint 5 == && assert @@ -1336,7 +1334,7 @@ test_fixed_size_named_tuple_array_for_header@2: // tests/artifacts/Arrays/immutable.py:203 // for i in urange(5): dup - pushint 5 // 5 + pushint 5 < bz test_fixed_size_named_tuple_array_after_for@5 // tests/artifacts/Arrays/immutable.py:204 @@ -1346,7 +1344,7 @@ test_fixed_size_named_tuple_array_for_header@2: % ! dig 1 - pushint 3 // 3 + pushint 3 * intc_2 // 2 % @@ -1388,7 +1386,7 @@ test_fixed_size_named_tuple_array_after_for@5: dup intc_0 // 0 extract_uint16 // on error: invalid array length header - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:207 @@ -1399,10 +1397,10 @@ test_fixed_size_named_tuple_array_after_for@5: intc_0 // 0 extract_uint64 dig 1 - pushint 64 // 64 + pushint 64 getbit uncover 2 - pushint 65 // 65 + pushint 65 getbit // tests/artifacts/Arrays/immutable.py:208 // assert foo == 0 @@ -1441,7 +1439,7 @@ test_dynamic_sized_tuple_array_for_header@2: // tests/artifacts/Arrays/immutable.py:218 // for i in urange(5): dup - pushint 5 // 5 + pushint 5 < bz test_dynamic_sized_tuple_array_after_for@5 // tests/artifacts/Arrays/immutable.py:219 @@ -1489,7 +1487,7 @@ test_dynamic_sized_tuple_array_after_for@5: extract_uint16 // on error: invalid array length header dup bury 4 - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:222 @@ -1501,7 +1499,7 @@ test_dynamic_sized_tuple_array_for_header@6: // tests/artifacts/Arrays/immutable.py:222 // for i in urange(5): dup - pushint 5 // 5 + pushint 5 < bz test_dynamic_sized_tuple_array_after_for@9 // tests/artifacts/Arrays/immutable.py:223 @@ -1573,7 +1571,7 @@ test_dynamic_sized_tuple_array_after_for@9: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arrays/immutable.py:228 @@ -1658,9 +1656,9 @@ test_dynamic_sized_tuple_array_after_for@9: substring3 extract 2 0 swap - pushint 4 // 4 + pushint 4 == - pushint 3 // 3 + pushint 3 bzero uncover 2 == @@ -1691,7 +1689,7 @@ test_dynamic_sized_named_tuple_array_for_header@2: // tests/artifacts/Arrays/immutable.py:237 // for i in urange(5): dup - pushint 5 // 5 + pushint 5 < bz test_dynamic_sized_named_tuple_array_after_for@5 // tests/artifacts/Arrays/immutable.py:238 @@ -1739,7 +1737,7 @@ test_dynamic_sized_named_tuple_array_after_for@5: extract_uint16 // on error: invalid array length header dup bury 4 - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:241 @@ -1751,7 +1749,7 @@ test_dynamic_sized_named_tuple_array_for_header@6: // tests/artifacts/Arrays/immutable.py:241 // for i in urange(5): dup - pushint 5 // 5 + pushint 5 < bz test_dynamic_sized_named_tuple_array_after_for@9 // tests/artifacts/Arrays/immutable.py:242 @@ -1823,7 +1821,7 @@ test_dynamic_sized_named_tuple_array_after_for@9: intc_0 // 0 extract_uint16 // on error: invalid array length header dup - pushint 4 // 4 + pushint 4 == assert // tests/artifacts/Arrays/immutable.py:247 @@ -1907,7 +1905,7 @@ test_dynamic_sized_named_tuple_array_after_for@9: substring3 extract 2 0 swap - pushint 4 // 4 + pushint 4 == swap pushbytes " " @@ -2177,7 +2175,7 @@ test_bit_packed_tuples_for_header@2: // tests/artifacts/Arrays/immutable.py:288 // for i in urange(5): dup - pushint 5 // 5 + pushint 5 < bz test_bit_packed_tuples_after_for@5 // tests/artifacts/Arrays/immutable.py:289 @@ -2221,22 +2219,22 @@ test_bit_packed_tuples_for_header@2: // tests/artifacts/Arrays/immutable.py:297 // d=i == 3, dig 3 - pushint 3 // 3 + pushint 3 == // tests/artifacts/Arrays/immutable.py:298 // e=i == 4, dig 4 - pushint 4 // 4 + pushint 4 == // tests/artifacts/Arrays/immutable.py:299 // f=i == 5, dig 5 - pushint 5 // 5 + pushint 5 == // tests/artifacts/Arrays/immutable.py:300 // g=i == 6, dig 6 - pushint 6 // 6 + pushint 6 == // tests/artifacts/Arrays/immutable.py:290-302 // arr7 = arr7.append( @@ -2258,16 +2256,16 @@ test_bit_packed_tuples_for_header@2: intc_2 // 2 uncover 7 setbit - pushint 3 // 3 + pushint 3 uncover 6 setbit - pushint 4 // 4 + pushint 4 uncover 5 setbit - pushint 5 // 5 + pushint 5 uncover 4 setbit - pushint 6 // 6 + pushint 6 uncover 3 setbit dup2 @@ -2293,7 +2291,7 @@ test_bit_packed_tuples_for_header@2: // tests/artifacts/Arrays/immutable.py:314 // h=i == 7, dig 4 - pushint 7 // 7 + pushint 7 == // tests/artifacts/Arrays/immutable.py:303-316 // arr8 = arr8.append( @@ -2311,7 +2309,7 @@ test_bit_packed_tuples_for_header@2: // ) // ) uncover 2 - pushint 7 // 7 + pushint 7 uncover 2 setbit uncover 2 @@ -2384,7 +2382,7 @@ test_bit_packed_tuples_after_for@5: dup intc_0 // 0 extract_uint16 // on error: invalid array length header - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:334 @@ -2393,7 +2391,7 @@ test_bit_packed_tuples_after_for@5: dup intc_0 // 0 extract_uint16 // on error: invalid array length header - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:335 @@ -2402,7 +2400,7 @@ test_bit_packed_tuples_after_for@5: dup intc_0 // 0 extract_uint16 // on error: invalid array length header - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:336 @@ -2411,7 +2409,7 @@ test_bit_packed_tuples_after_for@5: dup intc_0 // 0 extract_uint16 // on error: invalid array length header - pushint 5 // 5 + pushint 5 == assert // tests/artifacts/Arrays/immutable.py:337 @@ -2506,7 +2504,7 @@ sum_uints_and_lengths_and_trues_for_header@6: < bz sum_uints_and_lengths_and_trues_after_for@11 dig 12 - pushint 16 // 16 + pushint 16 + dig 9 swap @@ -2548,18 +2546,18 @@ sum_uints_and_lengths_and_trues_for_header@12: dig 7 extract 2 0 dig 12 - pushint 9 // 9 + pushint 9 * - pushint 9 // 9 + pushint 9 extract3 // on error: index access is out of bounds dup intc_0 // 0 extract_uint64 dig 1 - pushint 64 // 64 + pushint 64 getbit uncover 2 - pushint 65 // 65 + pushint 65 getbit bury 13 // tests/artifacts/Arrays/immutable.py:357 @@ -2835,7 +2833,7 @@ test_tuple_return_for_header@2: % ! dig 1 - pushint 3 // 3 + pushint 3 % ! dig 2 @@ -2977,7 +2975,7 @@ test_convert_to_array_and_back_for_header@2: % ! dig 1 - pushint 3 // 3 + pushint 3 % ! dig 4 @@ -3009,7 +3007,7 @@ test_convert_to_array_and_back_after_for@5: // return mutable.freeze() dup len - pushint 9 // 9 + pushint 9 / itob extract 6 2 @@ -3205,7 +3203,7 @@ test_immutable_arc4: dig 1 extract 2 16 swap - pushint 16 // 16 + pushint 16 * intc_2 // 2 + @@ -3226,7 +3224,7 @@ test_imm_fixed_arr: bytec_0 // "" // tests/artifacts/Arrays/immutable.py:453 // arr1 = zero_bytes(NativeStruct3) - pushint 48 // 48 + pushint 48 bzero dup // tests/artifacts/Arrays/immutable.py:454 @@ -3265,13 +3263,13 @@ test_imm_fixed_arr_for_header@2: // tests/artifacts/Arrays/immutable.py:460 // for i in urange(3): dup - pushint 3 // 3 + pushint 3 < bz test_imm_fixed_arr_after_for@5 // tests/artifacts/Arrays/immutable.py:461 // arr1 = arr1.replace(i, struct12) dupn 2 - pushint 16 // 16 + pushint 16 * dig 5 swap @@ -3299,16 +3297,16 @@ test_imm_fixed_arr_for_header@6: // tests/artifacts/Arrays/immutable.py:465 // for struct_it in arr1: dig 4 - pushint 3 // 3 + pushint 3 < bz test_imm_fixed_arr_after_for@9 dig 4 dup - pushint 16 // 16 + pushint 16 * dig 5 swap - pushint 16 // 16 + pushint 16 extract3 // on error: index access is out of bounds // tests/artifacts/Arrays/immutable.py:466 // assert struct_it == struct12, "expected items on iteration to be the same" @@ -3332,7 +3330,7 @@ test_imm_fixed_arr_after_for@9: // assert sum_imm_fixed(mut_arr.freeze()) == 15, "expected sum to be 15" dup callsub sum_imm_fixed - pushint 15 // 15 + pushint 15 == assert // expected sum to be 15 // tests/artifacts/Arrays/immutable.py:474 @@ -3342,7 +3340,7 @@ test_imm_fixed_arr_after_for@9: // tests/artifacts/Arrays/immutable.py:475 // assert sum_imm_fixed(mut_arr.freeze()) == 10, "expected sum to be 10" callsub sum_imm_fixed - pushint 10 // 10 + pushint 10 == assert // expected sum to be 10 // tests/artifacts/Arrays/immutable.py:477 diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json index beb97c30..00f8753b 100644 --- a/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json @@ -595,209 +595,197 @@ "sourceInfo": [ { "pc": [ - 153 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 340 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 4106 + 4104 ], "errorMessage": "check self.imm_fixed_arr exists" }, { "pc": [ - 2181, - 2489 + 2179, + 2487 ], "errorMessage": "expected 1, 0" }, { "pc": [ - 2096, - 2404 + 2094, + 2402 ], "errorMessage": "expected 1st element to be correct" }, { "pc": [ - 2101, - 2411 + 2099, + 2409 ], "errorMessage": "expected 2nd element to be correct" }, { "pc": [ - 2242, - 2551 + 2240, + 2549 ], "errorMessage": "expected 4, 3" }, { "pc": [ - 3990 + 3988 ], "errorMessage": "expected arrays to be different" }, { "pc": [ - 4024 + 4022 ], "errorMessage": "expected arrays to be the same" }, { "pc": [ - 1550 + 1548 ], "errorMessage": "expected element 0 to be False" }, { "pc": [ - 1569 + 1567 ], "errorMessage": "expected element 1 to be False" }, { "pc": [ - 1587 + 1585 ], "errorMessage": "expected element 2 to be True" }, { "pc": [ - 4051 + 4049 ], "errorMessage": "expected items on iteration to be the same" }, { "pc": [ - 1613 + 1611 ], "errorMessage": "expected last element to be False" }, { "pc": [ - 3937 + 3935 ], "errorMessage": "expected non empty array" }, { "pc": [ - 3365 + 3363 ], "errorMessage": "expected string length to match index" }, { "pc": [ - 4101 + 4099 ], "errorMessage": "expected sum to be 10" }, { "pc": [ - 4074 + 4072 ], "errorMessage": "expected sum to be 15" }, { "pc": [ - 854, - 1158, - 1223, - 1291, - 1348, - 1458, - 1543, - 1562, - 1581, - 1604, - 1755, - 1819, - 2052, - 2133, - 2198, - 2360, - 2443, - 2506, - 3216, - 3309, - 3952, - 4009, - 4047, - 4093 + 852, + 1156, + 1221, + 1289, + 1346, + 1456, + 1541, + 1560, + 1579, + 1602, + 1753, + 1817, + 2050, + 2131, + 2196, + 2358, + 2441, + 2504, + 3214, + 3307, + 3950, + 4007, + 4045, + 4091 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 970, - 1011, - 1067, - 1094, - 1134, - 1162, - 1206, - 1271, - 1328, - 1440, - 1527, - 1658, - 1717, - 1781, - 1908, - 2010, - 2116, - 2318, - 2426, - 2683, - 2724, - 3014, - 3023, - 3032, - 3041, - 3109, - 3146, - 3190, - 3271, - 3912, - 3935 + 968, + 1009, + 1065, + 1092, + 1132, + 1160, + 1204, + 1269, + 1326, + 1438, + 1525, + 1656, + 1715, + 1779, + 1906, + 2008, + 2114, + 2316, + 2424, + 2681, + 2722, + 3012, + 3021, + 3030, + 3039, + 3107, + 3144, + 3188, + 3269, + 3910, + 3933 ], "errorMessage": "invalid array length header" }, { "pc": [ - 925, - 998, - 1122, - 1196, - 1246, - 1316, - 1428, - 1694, - 1883, - 2624, - 2771, - 2835, - 2921, - 2960, - 2991, - 3440, - 3573, - 3747, - 3781, - 3816 + 923, + 996, + 1120, + 1194, + 1244, + 1314, + 1426, + 1692, + 1881, + 2622, + 2769, + 2833, + 2919, + 2958, + 2989, + 3438, + 3571, + 3745, + 3779, + 3814 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 1309 + 1307 ], "errorMessage": "overflow" } @@ -810,19 +798,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NGQ0MmY5OSAweGI3ZWFhNjBiIDB4NzQzZDcwZWQgMHgxYzdlMDQ5NCAweGEyZDU4NjBiIDB4ZTA1ZmM1NjQgMHgxZTA5MmI4MyAweDAxMzEwMjYyIDB4Yzg2NTRhOTggMHg4OWQxOTZmOCAweDZjYjdjOTkxIDB4OTg5OGJmMDIgMHhmNmI2MWVlOCAweDYwYjg2YTdiIDB4NzNhZDI4M2YgMHg1MjlkZmFlOSAweDIwNmQ1MTRmIDB4ZTA2NDY1ZTIgMHhlYzAzMDBhMiAweGVjZGYxNGFmIDB4NTExYWNhNjQgMHgyOTg1MmU0ZiAweDZkNGFhMzU4IDB4YjdjYjk2YmQgLy8gbWV0aG9kICJ0ZXN0X3VpbnQ2NF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9iaWd1aW50X2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCh1aW50NjRbXSl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9hcnJheSh1aW50NjQsdWludDY0W11bXSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9iaXRfcGFja2VkX3R1cGxlcygpdm9pZCIsIG1ldGhvZCAic3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyh1aW50NjRbXSxib29sW10sKHVpbnQ2NCxib29sLGJvb2wpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInRlc3RfdWludDY0X3JldHVybih1aW50NjQpdWludDY0W10iLCBtZXRob2QgInRlc3RfYm9vbF9yZXR1cm4odWludDY0KWJvb2xbXSIsIG1ldGhvZCAidGVzdF90dXBsZV9yZXR1cm4odWludDY0KSh1aW50NjQsYm9vbCxib29sKVtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrKCh1aW50NjQsYm9vbCxib29sKVtdLHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgoc3RyaW5nLHN0cmluZykpc3RyaW5nW10iLCBtZXRob2QgInRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYygodWludDY0LHN0cmluZylbXSwodWludDY0LHN0cmluZylbXSkodWludDY0LHN0cmluZylbXSIsIG1ldGhvZCAidGVzdF9pbW11dGFibGVfYXJjNCgodWludDY0LHVpbnQ2NClbXSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9pbW1fZml4ZWRfYXJyKCkodWludDY0LHVpbnQ2NClbM10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB0ZXN0X3VpbnQ2NF9hcnJheSB0ZXN0X2JpZ3VpbnRfYXJyYXkgdGVzdF9ib29sX2FycmF5IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheSB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nIHRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0IHRlc3RfbmVzdGVkX2FycmF5IHRlc3RfYml0X3BhY2tlZF90dXBsZXMgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlcyB0ZXN0X3VpbnQ2NF9yZXR1cm4gdGVzdF9ib29sX3JldHVybiB0ZXN0X3R1cGxlX3JldHVybiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuIHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjayB0ZXN0X2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUgdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZSB0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYyB0ZXN0X2ltbXV0YWJsZV9hcmM0IHRlc3RfaW1tX2ZpeGVkX2FycgogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDMxOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplKGFycmF5OiBieXRlcywgZml4ZWRfYnl0ZV9zaXplOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZToKICAgIHByb3RvIDIgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBkdXAKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QzCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudChhcnJheTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMSAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgYnl0ZWNfMCAvLyAweAogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2J1cnkgMQogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYml0cyhhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCByZWFkX3N0ZXA6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHM6CiAgICBwcm90byA0IDEKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgZnJhbWVfZGlnIC00CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cG4gMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIHJlcGxhY2UyIDAKICAgIGNvdmVyIDIKICAgIHN3YXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgIDwKICAgIGJ6IHN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczLTU3NAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgLy8gICAgIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc0CiAgICAvLyB0b3RhbCArPSBpdGVtLmZvbwogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzUKICAgIC8vIHRvdGFsICs9IGl0ZW0uYmFyCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBzdW1faW1tX2ZpeGVkX2Zvcl9oZWFkZXJAMQoKc3VtX2ltbV9maXhlZF9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NgogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS50aW1lcyhuOiB1aW50NjQpIC0+IGJ5dGVzOgp0aW1lczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3OS01ODAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGltZXMobjogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MQogICAgLy8gcmVzdWx0ID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGludGNfMCAvLyAwCgp0aW1lc19mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0aW1lc19hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgzCiAgICAvLyByZXN1bHQgKz0gU3RyaW5nKCIgIikKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGltZXNfZm9yX2hlYWRlckAxCgp0aW1lc19hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4NAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuYWRkX3goYXJyOiBieXRlcywgeDogdWludDY0KSAtPiBieXRlczoKYWRkX3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODctNTg4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFkZF94KGFycjogSW1tdXRhYmxlQXJyYXlbVUludDY0XSwgeDogVUludDY0KSAtPiBJbW11dGFibGVBcnJheVtVSW50NjRdOgogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgphZGRfeF9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIDwKICAgIGJ6IGFkZF94X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODkKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYWRkX3hfZm9yX2hlYWRlckAxCgphZGRfeF9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5MQogICAgLy8gcmV0dXJuIGFycgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfdWludDY0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF91aW50NjRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5OQogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDIpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwMwogICAgLy8gYXJyID0gYWRkX3goYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUgLy8gNQogICAgY2FsbHN1YiBhZGRfeAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA3CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0MykpCiAgICBwdXNoaW50IDQzIC8vIDQzCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwOAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MyAvLyA0MwogICAgPT0KICAgIGFzc2VydAogICAgaW50Y18yIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTYKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExMgogICAgLy8gYXJyID0gcG9wX3goYXJyLCBVSW50NjQoMykpCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE0CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTYKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDEwKSkKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgYWRkX3gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMTQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNCAvLyAxNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA5CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMAogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDQpKQogICAgcHVzaGludCA0NCAvLyA0NAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIxCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjIKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQ0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyNAogICAgLy8gYXJyID0gYXJyLnJlcGxhY2UoMiwgVUludDY0KDIzKSkKICAgIHB1c2hpbnQgMjMgLy8gMjMKICAgIGl0b2IKICAgIHJlcGxhY2UyIDE4IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI1CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxNSAvLyAxNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI2CiAgICAvLyBhc3NlcnQgYXJyWzJdID09IDIzCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDIzIC8vIDIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjgKICAgIC8vIHNlbGYuYSA9IGFycgogICAgcHVzaGJ5dGVzICJhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9iaWd1aW50X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaWd1aW50X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM1CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoVHhuLm51bV9hcHBfYXJncyAtIDEpKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBiemVybwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTMyCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtCaWdVSW50XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM1CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoVHhuLm51bV9hcHBfYXJncyAtIDEpKQogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDAxCiAgICByZXBsYWNlMiAwCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzNwogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpZ3VpbnRfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEzOQogICAgLy8gYXJyID0gYWRkX3hiKGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1IC8vIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAqCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA0CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQzCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkgLSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3dhcAogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBkaWcgNQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ1CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAyKio1MTIgLSAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICoKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmUKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDYKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMiA2NAogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0OAogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpKQogICAgc3dhcAogICAgYnl0ZWMgNSAvLyAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ5CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA4CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICoKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTUxCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDAKICAgIGR1cAogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTUzCiAgICAvLyBCb3goSW1tdXRhYmxlQXJyYXlbQmlnVUludF0sIGtleT1iImJpZ3VpbnQiKS52YWx1ZSA9IGFycgogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDcgLy8gMHg2MjY5Njc3NTY5NmU3NAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9ib29sX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9ib29sX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTU3CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtib29sXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYyCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkgPT0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBkaWcgMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZGlnIDMKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBpbnRjXzMgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2MQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgYnVyeSA1CiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjYKICAgIC8vIGlmIGxlbmd0aCA+IDA6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjcKICAgIC8vIGFzc2VydCBub3QgYXJyWzBdLCAiZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlIgogICAgZGlnIDMKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2OAogICAgLy8gaWYgbGVuZ3RoID4gMToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY5CiAgICAvLyBhc3NlcnQgbm90IGFyclsxXSwgImV4cGVjdGVkIGVsZW1lbnQgMSB0byBiZSBGYWxzZSIKICAgIGludGNfMSAvLyAxCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNyAvLyAxNwogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcwCiAgICAvLyBpZiBsZW5ndGggPiAyOgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcxCiAgICAvLyBhc3NlcnQgYXJyWzJdLCAiZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUiCiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGVsZW1lbnQgMiB0byBiZSBUcnVlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MgogICAgLy8gaWYgbGVuZ3RoID4gMzoKICAgIGRpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IGxlbmd0aCAtIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgID09CiAgICBhc3NlcnQKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTgyCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVt0dXBsZVtVSW50NjQsIFVJbnQ2NF1dKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODUKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NgogICAgLy8gYXJyID0gYXJyLmFwcGVuZCgoaSArIDEsIGkgKyAyKSkKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTIKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgcHVzaGludCAxNiAvLyAxNgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBzd2FwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NgogICAgLy8gc2VsZi5jID0gYXJyCiAgICBwdXNoYnl0ZXMgImMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAwCiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeVR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDcKICAgIC8vIGZvbywgYmFyLCBiYXogPSBhcnJbMF0KICAgIGR1cAogICAgZXh0cmFjdCAyIDkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgcHVzaGludCA2NCAvLyA2NAogICAgZ2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNjUgLy8gNjUKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjA4CiAgICAvLyBhc3NlcnQgZm9vID09IDAKICAgIHVuY292ZXIgMgogICAgIQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDkKICAgIC8vIGFzc2VydCBiYXIKICAgIHN3YXAKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjEwCiAgICAvLyBhc3NlcnQgYmF6CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxMQogICAgLy8gc2VsZi5kID0gYXJyCiAgICBwdXNoYnl0ZXMgImQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE1CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVt0dXBsZVtVSW50NjQsIEJ5dGVzXV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1IC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjMKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNAogICAgLy8gYXNzZXJ0IGFycltpXVsxXS5sZW5ndGggPT0gaSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAybmQgZWxlbWVudCB0byBiZSBjb3JyZWN0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJANgoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI2CiAgICAvLyBhcnIgPSBhcnIucG9wKCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgcHVzaGludCAzIC8vIDMKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQsIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMAogICAgLy8gc2VsZi5lID0gYXJyCiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5OgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM0CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheVtNeUR5bmFtaWNTaXplZFR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzNwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1IC8vIDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQyCiAgICAvLyBhc3NlcnQgYXJyW2ldWzBdID09IGkgKyAxLCAiZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgNgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA1CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDMKICAgIC8vIGFzc2VydCBhcnJbaV1bMV0gPT0gdGltZXMoaSksICJleHBlY3RlZCAybmQgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDUKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NgogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiAgICIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDQsIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0OQogICAgLy8gc2VsZi5mID0gYXJyCiAgICBwdXNoYnl0ZXMgImYiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTMKICAgIC8vIGxvZyhhcnIpCiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTcKICAgIC8vIGFyYzQuZW1pdCgiZW1pdF90ZXN0IiwgYXJyKQogICAgcHVzaGJ5dGVzIDB4ZmE0MGMwNTMwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTcKICAgIC8vIGFyYzQuZW1pdCgiZW1pdF90ZXN0IiwgYXJyKQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfbmVzdGVkX2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfYXJyYXk6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2My0yNjQKICAgIC8vICMgYWRkIG4gbmV3IGFycmF5cwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFycl90b19hZGQpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2My0yNjQKICAgIC8vICMgYWRkIG4gbmV3IGFycmF5cwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFycl90b19hZGQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NQogICAgLy8gZXh0cmFfYXJyID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjYKICAgIC8vIGZvciBqIGluIHVyYW5nZShpKToKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NwogICAgLy8gZXh0cmFfYXJyID0gZXh0cmFfYXJyLmFwcGVuZChqKQogICAgZGlnIDQKICAgIGR1cAogICAgaXRvYgogICAgZGlnIDEzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJANAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoZXh0cmFfYXJyKQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIGRpZyAxNAogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcwLTI3MQogICAgLy8gIyBzdW0gaW5uZXIgYXJyYXlzIGFuZCByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBzdW1zCiAgICAvLyB0b3RhbHMgPSBJbW11dGFibGVBcnJheVtVSW50NjRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBidXJ5IDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzIKICAgIC8vIGZvciBpbm5lcl9hcnIgaW4gYXJyOgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBidXJ5IDkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKCnRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNzIKICAgIC8vIGZvciBpbm5lcl9hcnIgaW4gYXJyOgogICAgZGlnIDYKICAgIGRpZyA5CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTMKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDcKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMAogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjExCiAgICAvLyBmb3IgaSBpbiBhcnI6CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA4CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjExCiAgICAvLyBmb3IgaSBpbiBhcnI6CiAgICBkaWcgNQogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNwogICAgZGlnIDEwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTIKICAgIC8vIHRvdGFsICs9IGkKICAgIGRpZyA1CiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNQoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDE3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjczCiAgICAvLyB0b3RhbHMgPSB0b3RhbHMuYXBwZW5kKHN1bV9hcnIoaW5uZXJfYXJyKSkKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMTAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDEwCiAgICBkaWcgNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNwogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYml0X3BhY2tlZF90dXBsZXNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjc5CiAgICAvLyBhcnIyID0gSW1tdXRhYmxlQXJyYXlbVHdvQm9vbFR1cGxlXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjgwLTI4MgogICAgLy8gYXJyNyA9IEltbXV0YWJsZUFycmF5W1NldmVuQm9vbFR1cGxlXSgpCiAgICAvLyBhcnI4ID0gSW1tdXRhYmxlQXJyYXlbRWlnaHRCb29sVHVwbGVdKCkKICAgIC8vIGFycjkgPSBJbW11dGFibGVBcnJheVtOaW5lQm9vbFR1cGxlXSgpCiAgICBkdXBuIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjg4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODkKICAgIC8vIGFycjIgPSBhcnIyLmFwcGVuZChUd29Cb29sVHVwbGUoYT1pID09IDAsIGI9aSA9PSAxKSkKICAgIGR1cG4gMgogICAgIQogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTMKICAgIC8vIGJhcj1pICsgMSwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk2CiAgICAvLyBjPWkgPT0gMiwKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5NwogICAgLy8gZD1pID09IDMsCiAgICBkaWcgMwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk5CiAgICAvLyBmPWkgPT0gNSwKICAgIGRpZyA1CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMwMAogICAgLy8gZz1pID09IDYsCiAgICBkaWcgNgogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzIC8vIDMKICAgIHVuY292ZXIgNgogICAgc2V0Yml0CiAgICBwdXNoaW50IDQgLy8gNAogICAgdW5jb3ZlciA1CiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNSAvLyA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2IC8vIDYKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBkdXAyCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgOQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzE0CiAgICAvLyBoPWkgPT0gNywKICAgIGRpZyA0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMwMy0zMTYKICAgIC8vIGFycjggPSBhcnI4LmFwcGVuZCgKICAgIC8vICAgICBFaWdodEJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzNAogICAgLy8gYXNzZXJ0IGFycjcubGVuZ3RoID09IDUKICAgIGRpZyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM1CiAgICAvLyBhc3NlcnQgYXJyOC5sZW5ndGggPT0gNQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzNwogICAgLy8gc2VsZi5ib29sMiA9IGFycjIKICAgIHB1c2hieXRlcyAiYm9vbDIiCiAgICB1bmNvdmVyIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzgKICAgIC8vIHNlbGYuYm9vbDcgPSBhcnI3CiAgICBwdXNoYnl0ZXMgImJvb2w3IgogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM5CiAgICAvLyBzZWxmLmJvb2w4ID0gYXJyOAogICAgcHVzaGJ5dGVzICJib29sOCIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MAogICAgLy8gc2VsZi5ib29sOSA9IGFycjkKICAgIHB1c2hieXRlcyAiYm9vbDkiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3Quc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXM6CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MAogICAgLy8gc3VtMSA9IHN1bTIgPSBzdW0zID0gc3VtNCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTEKICAgIC8vIGZvciBpIGluIGFycjE6CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDAKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANQogICAgZGlnIDkKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MgogICAgLy8gc3VtMSArPSBpCiAgICBkaWcgNAogICAgKwogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAyCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDgKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBidXJ5IDE3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMwoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTMKICAgIC8vIGZvciBiIGluIGFycjI6CiAgICBkaWcgMTIKICAgIGRpZyAxNwogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTEKICAgIGRpZyAxMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgKwogICAgZGlnIDkKICAgIHN3YXAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzU0CiAgICAvLyBpZiBiOgogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NQogICAgLy8gc3VtMiArPSAxCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNAoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgMTIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEzCiAgICBiIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBidXJ5IDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzU2CiAgICAvLyBmb3IgdHVwIGluIGFycjM6CiAgICBkaWcgMTEKICAgIGRpZyAxNgogICAgPAogICAgYnogc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTkKICAgIGRpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEyCiAgICBwdXNoaW50IDkgLy8gOQogICAgKgogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NSAvLyA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF90dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X3R1cGxlX3JldHVybl9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KCksIFN0cmluZygiSGVsbG8iKSksKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMGEwMDA1NDg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShpLCB0aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgdGltZXMKICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAyCiAgICAvLyBtdXRhYmxlLmV4dGVuZChhcnIpCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja19hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA0CiAgICAvLyBtdXRhYmxlLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAlCiAgICAhCiAgICBkaWcgNAogICAgY292ZXIgMwogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMgoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNQogICAgLy8gcmV0dXJuIG11dGFibGUuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDkgLy8gOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OCAvLyA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjEKICAgIC8vIGFycjEgPSBhcnIxLnJlcGxhY2UoaSwgc3RydWN0MTIpCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIGRpZyA1CiAgICBzd2FwCiAgICBkaWcgNQogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ltbV9maXhlZF9hcnJfZm9yX2hlYWRlckAyCgp0ZXN0X2ltbV9maXhlZF9hcnJfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjMKICAgIC8vIGFzc2VydCBhcnIxID09IGFycjIsICJleHBlY3RlZCBhcnJheXMgdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgMwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2ltbV9maXhlZF9hcnJfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY1CiAgICAvLyBmb3Igc3RydWN0X2l0IGluIGFycjE6CiAgICBkaWcgNAogICAgcHVzaGludCAzIC8vIDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JAOQogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY2CiAgICAvLyBhc3NlcnQgc3RydWN0X2l0ID09IHN0cnVjdDEyLCAiZXhwZWN0ZWQgaXRlbXMgb24gaXRlcmF0aW9uIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgaXRlbXMgb24gaXRlcmF0aW9uIHRvIGJlIHRoZSBzYW1lCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfaW1tX2ZpeGVkX2Fycl9mb3JfaGVhZGVyQDYKCnRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2OAogICAgLy8gc2VsZi5pbW1fZml4ZWRfYXJyID0gYXJyMQogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDcyCiAgICAvLyBhc3NlcnQgc3VtX2ltbV9maXhlZChtdXRfYXJyLmZyZWV6ZSgpKSA9PSAxNSwgImV4cGVjdGVkIHN1bSB0byBiZSAxNSIKICAgIGR1cAogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc0CiAgICAvLyBtdXRfYXJyWzBdID0gTmF0aXZlU3RydWN0KFVJbnQ2NCgpLCBVSW50NjQoKSkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAwIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc1CiAgICAvLyBhc3NlcnQgc3VtX2ltbV9maXhlZChtdXRfYXJyLmZyZWV6ZSgpKSA9PSAxMCwgImV4cGVjdGVkIHN1bSB0byBiZSAxMCIKICAgIGNhbGxzdWIgc3VtX2ltbV9maXhlZAogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBzdW0gdG8gYmUgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ3NwogICAgLy8gcmV0dXJuIHNlbGYuaW1tX2ZpeGVkX2FycgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbW1fZml4ZWRfYXJyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltbV9maXhlZF9hcnIgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrIDB4IDB4MTUxZjdjNzUgMHgwMDAwIDB4MDAgMHgwMDAyIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgMHgwMDBhIDB4NjI2OTY3NzU2OTZlNzQgMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIgMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIgImltbV9maXhlZF9hcnIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo5MwogICAgLy8gY2xhc3MgSW1tdXRhYmxlQXJyYXlDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NDRkNDJmOTkgMHhiN2VhYTYwYiAweDc0M2Q3MGVkIDB4MWM3ZTA0OTQgMHhhMmQ1ODYwYiAweGUwNWZjNTY0IDB4MWUwOTJiODMgMHgwMTMxMDI2MiAweGM4NjU0YTk4IDB4ODlkMTk2ZjggMHg2Y2I3Yzk5MSAweDk4OThiZjAyIDB4ZjZiNjFlZTggMHg2MGI4NmE3YiAweDczYWQyODNmIDB4NTI5ZGZhZTkgMHgyMDZkNTE0ZiAweGUwNjQ2NWUyIDB4ZWMwMzAwYTIgMHhlY2RmMTRhZiAweDUxMWFjYTY0IDB4Mjk4NTJlNGYgMHg2ZDRhYTM1OCAweGI3Y2I5NmJkIC8vIG1ldGhvZCAidGVzdF91aW50NjRfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfYmlndWludF9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfZml4ZWRfc2l6ZV9uYW1lZF90dXBsZV9hcnJheSgpdm9pZCIsIG1ldGhvZCAidGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkoKXZvaWQiLCBtZXRob2QgInRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2codWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2VtaXQodWludDY0W10pdm9pZCIsIG1ldGhvZCAidGVzdF9uZXN0ZWRfYXJyYXkodWludDY0LHVpbnQ2NFtdW10pdWludDY0W10iLCBtZXRob2QgInRlc3RfYml0X3BhY2tlZF90dXBsZXMoKXZvaWQiLCBtZXRob2QgInN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXModWludDY0W10sYm9vbFtdLCh1aW50NjQsYm9vbCxib29sKVtdLCh1aW50NjQsc3RyaW5nKVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ0ZXN0X3VpbnQ2NF9yZXR1cm4odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfcmV0dXJuKHVpbnQ2NClib29sW10iLCBtZXRob2QgInRlc3RfdHVwbGVfcmV0dXJuKHVpbnQ2NCkodWludDY0LGJvb2wsYm9vbClbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX3R1cGxlX3JldHVybih1aW50NjQpKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjaygodWludDY0LGJvb2wsYm9vbClbXSx1aW50NjQpKHVpbnQ2NCxib29sLGJvb2wpW10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfYXJjNF90dXBsZSgodWludDY0LHVpbnQ2NCkpdWludDY0W10iLCBtZXRob2QgInRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKCh1aW50NjQsdWludDY0KSl1aW50NjRbXSIsIG1ldGhvZCAidGVzdF9keW5hbWljX2NvbmNhdF93aXRoX2FyYzRfdHVwbGUoKHN0cmluZyxzdHJpbmcpKXN0cmluZ1tdIiwgbWV0aG9kICJ0ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlKChzdHJpbmcsc3RyaW5nKSlzdHJpbmdbXSIsIG1ldGhvZCAidGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMoKHVpbnQ2NCxzdHJpbmcpW10sKHVpbnQ2NCxzdHJpbmcpW10pKHVpbnQ2NCxzdHJpbmcpW10iLCBtZXRob2QgInRlc3RfaW1tdXRhYmxlX2FyYzQoKHVpbnQ2NCx1aW50NjQpW10pKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInRlc3RfaW1tX2ZpeGVkX2FycigpKHVpbnQ2NCx1aW50NjQpWzNdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF91aW50NjRfYXJyYXkgdGVzdF9iaWd1aW50X2FycmF5IHRlc3RfYm9vbF9hcnJheSB0ZXN0X2ZpeGVkX3NpemVfdHVwbGVfYXJyYXkgdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheSB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXkgdGVzdF9pbXBsaWNpdF9jb252ZXJzaW9uX2xvZyB0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdCB0ZXN0X25lc3RlZF9hcnJheSB0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzIHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXMgdGVzdF91aW50NjRfcmV0dXJuIHRlc3RfYm9vbF9yZXR1cm4gdGVzdF90dXBsZV9yZXR1cm4gdGVzdF9keW5hbWljX3R1cGxlX3JldHVybiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2sgdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlIHRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9uYXRpdmVfdHVwbGUgdGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWMgdGVzdF9pbW11dGFibGVfYXJjNCB0ZXN0X2ltbV9maXhlZF9hcnIKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcKICAgICsKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyA1CiAgICAtCiAgICBiemVybwogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkOgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgYnplcm8KICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuc3VtX2ltbV9maXhlZChhcnI6IGJ5dGVzKSAtPiB1aW50NjQ6CnN1bV9pbW1fZml4ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzAtNTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN1bV9pbW1fZml4ZWQoYXJyOiBOYXRpdmVTdHJ1Y3QzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3MgogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN1bV9pbW1fZml4ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTczCiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAzCiAgICA8CiAgICBieiBzdW1faW1tX2ZpeGVkX2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzMtNTc0CiAgICAvLyBmb3IgaXRlbSBpbiBhcnI6CiAgICAvLyAgICAgdG90YWwgKz0gaXRlbS5mb28KICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzQKICAgIC8vIHRvdGFsICs9IGl0ZW0uZm9vCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3My01NzQKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIC8vICAgICB0b3RhbCArPSBpdGVtLmZvbwogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU3NAogICAgLy8gdG90YWwgKz0gaXRlbS5mb28KICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTc1CiAgICAvLyB0b3RhbCArPSBpdGVtLmJhcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgc3VtX2ltbV9maXhlZF9mb3JfaGVhZGVyQDEKCnN1bV9pbW1fZml4ZWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzYKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUudGltZXMobjogdWludDY0KSAtPiBieXRlczoKdGltZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1NzktNTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRpbWVzKG46IFVJbnQ2NCkgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODEKICAgIC8vIHJlc3VsdCA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODIKICAgIC8vIGZvciBfaSBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKdGltZXNfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTgyCiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKG4pOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogdGltZXNfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MwogICAgLy8gcmVzdWx0ICs9IFN0cmluZygiICIpCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU4MgogICAgLy8gZm9yIF9pIGluIHVyYW5nZShuKToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRpbWVzX2Zvcl9oZWFkZXJAMQoKdGltZXNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1ODQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLmFkZF94KGFycjogYnl0ZXMsIHg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZF94OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg3LTU4OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhZGRfeChhcnI6IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0sIHg6IFVJbnQ2NCkgLT4gSW1tdXRhYmxlQXJyYXlbVUludDY0XToKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3hfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiBhZGRfeF9hZnRlcl9mb3JANAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTkwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGkpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTg5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIGFkZF94X2Zvcl9oZWFkZXJAMQoKYWRkX3hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo1OTEKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfdWludDY0X2FycmF5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTkKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoVUludDY0KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDMKICAgIC8vIGFyciA9IGFkZF94KGFyciwgVUludDY0KDUpKQogICAgcHVzaGludCA1CiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEwNwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChVSW50NjQoNDMpKQogICAgcHVzaGludCA0MwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMDgKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTA5CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSA0MwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQzCiAgICA9PQogICAgYXNzZXJ0CiAgICBpbnRjXzIgLy8gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEwCiAgICAvLyBhc3NlcnQgYXJyWzBdID09IDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0MgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfdWludDY0X2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEyCiAgICAvLyBhcnIgPSBwb3BfeChhcnIsIFVJbnQ2NCgzKSkKICAgIHB1c2hpbnQgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NTk2CiAgICAvLyBmb3IgX2kgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF91aW50NjRfYXJyYXlfYWZ0ZXJfZm9yQDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NwogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAzCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjU5NgogICAgLy8gZm9yIF9pIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X3VpbnQ2NF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfdWludDY0X2FycmF5X2FmdGVyX2ZvckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTEzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExNAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTE2CiAgICAvLyBhcnIgPSBhZGRfeChhcnIsIFVJbnQ2NCgxMCkpCiAgICBwdXNoaW50IDEwCiAgICBjYWxsc3ViIGFkZF94CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMTcKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjExOAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gOQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgOQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTIwCiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKFVJbnQ2NCg0NCkpCiAgICBwdXNoaW50IDQ0CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjEKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyMgogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gNDQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTI0CiAgICAvLyBhcnIgPSBhcnIucmVwbGFjZSgyLCBVSW50NjQoMjMpKQogICAgcHVzaGludCAyMwogICAgaXRvYgogICAgcmVwbGFjZTIgMTggLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjUKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDE1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDE1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMjYKICAgIC8vIGFzc2VydCBhcnJbMl0gPT0gMjMKICAgIGR1cAogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjEyOAogICAgLy8gc2VsZi5hID0gYXJyCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpZ3VpbnRfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2JpZ3VpbnRfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIHB1c2hpbnQgNjQKICAgIGJ6ZXJvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W0JpZ1VJbnRdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzUKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChUeG4ubnVtX2FwcF9hcmdzIC0gMSkpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHJlcGxhY2UyIDAKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM3CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSAwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNjQKICAgICoKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWNfMCAvLyAweAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSh4KToKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTM5CiAgICAvLyBhcnIgPSBhZGRfeGIoYXJyLCBVSW50NjQoNSkpCiAgICBwdXNoaW50IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKHgpOgogICAgPAogICAgYnogdGVzdF9iaWd1aW50X2FycmF5X2FmdGVyX2ZvckA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoQmlnVUludChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIGJ8CiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoeCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfYmlndWludF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYmlndWludF9hcnJheV9hZnRlcl9mb3JANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MAogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNgogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDEKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChCaWdVSW50KDIqKjUxMiAtIDEpIC0gVHhuLm51bV9hcHBfYXJncykKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpdG9iCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN3YXAKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZGlnIDUKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDQKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCA3CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDUKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IDIqKjUxMiAtIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE0NgogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAwCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDY0CiAgICBieXRlY18wIC8vIDB4CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTQ4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKEJpZ1VJbnQoMioqNTEyIC0gMSkpCiAgICBzd2FwCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNDkKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1MAogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gMioqNTEyIC0gMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA2NAogICAgKgogICAgcHVzaGludCA2NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBieXRlYyA1IC8vIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTEKICAgIC8vIGFzc2VydCBhcnJbMF0gPT0gMAogICAgZHVwCiAgICBleHRyYWN0IDIgNjQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTMKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtCaWdVSW50XSwga2V5PWIiYmlndWludCIpLnZhbHVlID0gYXJyCiAgICBieXRlYyA3IC8vIDB4NjI2OTY3NzU2OTZlNzQKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAweDYyNjk2Nzc1Njk2ZTc0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNTcKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgaW50Y18wIC8vIDAKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjEKICAgIC8vIGZvciBpIGluIHVyYW5nZShsZW5ndGgpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjIKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSA9PSBUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGRpZyAxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTYxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UobGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDUKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NgogICAgLy8gaWYgbGVuZ3RoID4gMDoKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE2NwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbMF0sICJleHBlY3RlZCBlbGVtZW50IDAgdG8gYmUgRmFsc2UiCiAgICBkaWcgMwogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAwIHRvIGJlIEZhbHNlCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTY4CiAgICAvLyBpZiBsZW5ndGggPiAxOgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNjkKICAgIC8vIGFzc2VydCBub3QgYXJyWzFdLCAiZXhwZWN0ZWQgZWxlbWVudCAxIHRvIGJlIEZhbHNlIgogICAgaW50Y18xIC8vIDEKICAgIGRpZyA0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDE3CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCBlbGVtZW50IDEgdG8gYmUgRmFsc2UKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzAKICAgIC8vIGlmIGxlbmd0aCA+IDI6CiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgID4KICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzEKICAgIC8vIGFzc2VydCBhcnJbMl0sICJleHBlY3RlZCBlbGVtZW50IDIgdG8gYmUgVHJ1ZSIKICAgIGludGNfMiAvLyAyCiAgICBkaWcgNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZWxlbWVudCAyIHRvIGJlIFRydWUKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTcyCiAgICAvLyBpZiBsZW5ndGggPiAzOgogICAgZGlnIDIKICAgIHB1c2hpbnQgMwogICAgPgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE3MwogICAgLy8gYXNzZXJ0IG5vdCBhcnJbbGVuZ3RoIC0gMV0sICJleHBlY3RlZCBsYXN0IGVsZW1lbnQgdG8gYmUgRmFsc2UiCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxNgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxhc3QgZWxlbWVudCB0byBiZSBGYWxzZQoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzUKICAgIC8vIHNlbGYuZyA9IGFycgogICAgcHVzaGJ5dGVzICJnIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxNzYKICAgIC8vIGlmIGxlbmd0aDoKICAgIGRpZyAyCiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAwCiAgICBkaWcgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGludGNfMiAvLyAyCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTc4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGggLSAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4MgogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXlbdHVwbGVbVUludDY0LCBVSW50NjRdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg1CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4NQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZml4ZWRfc2l6ZV90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg2CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgaSArIDIpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMgoKdGVzdF9maXhlZF9zaXplX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTg4CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA1CiAgICBkaWcgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE4OQogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTAKICAgIC8vIGFzc2VydCBhcnJbLTFdID09IChVSW50NjQoNSksIFVJbnQ2NCg2KSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIHN3YXAKICAgIHB1c2hpbnQgNgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5MgogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBwdXNoaW50IDE2CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTkzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk0CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IChVSW50NjQoMSksIFVJbnQ2NCgyKSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAxNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjE5NQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgVUludDY0KDUpKQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGludCA1CiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MTk2CiAgICAvLyBzZWxmLmMgPSBhcnIKICAgIHB1c2hieXRlcyAiYyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDAKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015VHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDMKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjAzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9maXhlZF9zaXplX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDQKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICogMyAlIDIgPT0gMCkpCiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAlCiAgICAhCiAgICBkaWcgMQogICAgcHVzaGludCAzCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2ZpeGVkX3NpemVfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDYKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwNwogICAgLy8gZm9vLCBiYXIsIGJheiA9IGFyclswXQogICAgZHVwCiAgICBleHRyYWN0IDIgOQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMDgKICAgIC8vIGFzc2VydCBmb28gPT0gMAogICAgdW5jb3ZlciAyCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIwOQogICAgLy8gYXNzZXJ0IGJhcgogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTAKICAgIC8vIGFzc2VydCBiYXoKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjExCiAgICAvLyBzZWxmLmQgPSBhcnIKICAgIHB1c2hieXRlcyAiZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToxOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTUKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W3R1cGxlW1VJbnQ2NCwgQnl0ZXNdXSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE4CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3NpemVkX3R1cGxlX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIxOAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjE5CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKChpICsgMSwgb3AuYnplcm8oaSkpKQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgc3dhcAogICAgYnplcm8KICAgIGRpZyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDYgLy8gMHgwMDBhCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMQogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKCnRlc3RfZHluYW1pY19zaXplZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjIKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8CiAgICBieiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyMwogICAgLy8gYXNzZXJ0IGFycltpXVswXSA9PSBpICsgMSwgImV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZGlnIDYKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMXN0IGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjI0CiAgICAvLyBhc3NlcnQgYXJyW2ldWzFdLmxlbmd0aCA9PSBpLCAiZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2R5bmFtaWNfc2l6ZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMjYKICAgIC8vIGFyciA9IGFyci5wb3AoKQogICAgZGlnIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyNwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOAogICAgLy8gYXNzZXJ0IGFyclswXSA9PSAoVUludDY0KDEpLCBvcC5iemVybygwKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDEsIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIyOQogICAgLy8gYXNzZXJ0IGFyclstMV0gPT0gKFVJbnQ2NCg0KSwgb3AuYnplcm8oMykpLCAiZXhwZWN0ZWQgNCwgMyIKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDQKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIHB1c2hpbnQgMwogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgNCwgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjMwCiAgICAvLyBzZWxmLmUgPSBhcnIKICAgIHB1c2hieXRlcyAiZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzQKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5W015RHluYW1pY1NpemVkVHVwbGVdKCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzcKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjM3CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyMzgKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoTXlEeW5hbWljU2l6ZWRUdXBsZShmb289aSArIDEsIGJhcj10aW1lcyhpKSkpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDAKICAgIC8vIGFzc2VydCBhcnIubGVuZ3RoID09IDUKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgp0ZXN0X2R5bmFtaWNfc2l6ZWRfbmFtZWRfdHVwbGVfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoNSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNQogICAgPAogICAgYnogdGVzdF9keW5hbWljX3NpemVkX25hbWVkX3R1cGxlX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDIKICAgIC8vIGFzc2VydCBhcnJbaV1bMF0gPT0gaSArIDEsICJleHBlY3RlZCAxc3QgZWxlbWVudCB0byBiZSBjb3JyZWN0IgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDUKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDFzdCBlbGVtZW50IHRvIGJlIGNvcnJlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0MwogICAgLy8gYXNzZXJ0IGFycltpXVsxXSA9PSB0aW1lcyhpKSwgImV4cGVjdGVkIDJuZCBlbGVtZW50IHRvIGJlIGNvcnJlY3QiCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGltZXMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMm5kIGVsZW1lbnQgdG8gYmUgY29ycmVjdAogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfZHluYW1pY19zaXplZF9uYW1lZF90dXBsZV9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI0NQogICAgLy8gYXJyID0gYXJyLnBvcCgpCiAgICBkaWcgMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ2CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ3CiAgICAvLyBhc3NlcnQgYXJyWzBdID09IE15RHluYW1pY1NpemVkVHVwbGUoVUludDY0KDEpLCBTdHJpbmcoKSksICJleHBlY3RlZCAxLCAwIgogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiIgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgMSwgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjQ4CiAgICAvLyBhc3NlcnQgYXJyWy0xXSA9PSBNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCg0KSwgU3RyaW5nKCIgICAiKSksICJleHBlY3RlZCA0LCAzIgogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgNAogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgcHVzaGludCA0CiAgICA9PQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIgICAiCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCA0LCAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNDkKICAgIC8vIHNlbGYuZiA9IGFycgogICAgcHVzaGJ5dGVzICJmIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjIzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9sb2dbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fbG9nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjUzCiAgICAvLyBsb2coYXJyKQogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2ltcGxpY2l0X2NvbnZlcnNpb25fZW1pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfaW1wbGljaXRfY29udmVyc2lvbl9lbWl0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIHB1c2hieXRlcyAweGZhNDBjMDUzMDAwMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU3CiAgICAvLyBhcmM0LmVtaXQoImVtaXRfdGVzdCIsIGFycikKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX2FycmF5OgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjMtMjY0CiAgICAvLyAjIGFkZCBuIG5ldyBhcnJheXMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcnJfdG9fYWRkKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjUKICAgIC8vIGV4dHJhX2FyciA9IEltbXV0YWJsZUFycmF5W1VJbnQ2NF0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGJ1cnkgMTIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY2CiAgICAvLyBmb3IgaiBpbiB1cmFuZ2UoaSk6CiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyNjcKICAgIC8vIGV4dHJhX2FyciA9IGV4dHJhX2Fyci5hcHBlbmQoaikKICAgIGRpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI2NgogICAgLy8gZm9yIGogaW4gdXJhbmdlKGkpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDQKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjY4CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKGV4dHJhX2FycikKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBkaWcgMTQKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjYzLTI2NAogICAgLy8gIyBhZGQgbiBuZXcgYXJyYXlzCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXJyX3RvX2FkZCk6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MC0yNzEKICAgIC8vICMgc3VtIGlubmVyIGFycmF5cyBhbmQgcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgc3VtcwogICAgLy8gdG90YWxzID0gSW1tdXRhYmxlQXJyYXlbVUludDY0XSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYnVyeSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSA5CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3Cgp0ZXN0X25lc3RlZF9hcnJheV9mb3JfaGVhZGVyQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjcyCiAgICAvLyBmb3IgaW5uZXJfYXJyIGluIGFycjoKICAgIGRpZyA2CiAgICBkaWcgOQogICAgPAogICAgYnogdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo2MTAKICAgIC8vIHRvdGFsID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgoKdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjYxMQogICAgLy8gZm9yIGkgaW4gYXJyOgogICAgZGlnIDUKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X25lc3RlZF9hcnJheV9hZnRlcl9mb3JAMTcKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NjEyCiAgICAvLyB0b3RhbCArPSBpCiAgICBkaWcgNQogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2CiAgICBiIHRlc3RfbmVzdGVkX2FycmF5X2Zvcl9oZWFkZXJAMTUKCnRlc3RfbmVzdGVkX2FycmF5X2FmdGVyX2ZvckAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3MwogICAgLy8gdG90YWxzID0gdG90YWxzLmFwcGVuZChzdW1fYXJyKGlubmVyX2FycikpCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDEwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAxMAogICAgZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDcKICAgIGIgdGVzdF9uZXN0ZWRfYXJyYXlfZm9yX2hlYWRlckAxMAoKdGVzdF9uZXN0ZWRfYXJyYXlfYWZ0ZXJfZm9yQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2JpdF9wYWNrZWRfdHVwbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9iaXRfcGFja2VkX3R1cGxlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3OQogICAgLy8gYXJyMiA9IEltbXV0YWJsZUFycmF5W1R3b0Jvb2xUdXBsZV0oKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4MC0yODIKICAgIC8vIGFycjcgPSBJbW11dGFibGVBcnJheVtTZXZlbkJvb2xUdXBsZV0oKQogICAgLy8gYXJyOCA9IEltbXV0YWJsZUFycmF5W0VpZ2h0Qm9vbFR1cGxlXSgpCiAgICAvLyBhcnI5ID0gSW1tdXRhYmxlQXJyYXlbTmluZUJvb2xUdXBsZV0oKQogICAgZHVwbiAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyODgKICAgIC8vIGZvciBpIGluIHVyYW5nZSg1KToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2JpdF9wYWNrZWRfdHVwbGVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDUpOgogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDwKICAgIGJ6IHRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI4OQogICAgLy8gYXJyMiA9IGFycjIuYXBwZW5kKFR3b0Jvb2xUdXBsZShhPWkgPT0gMCwgYj1pID09IDEpKQogICAgZHVwbiAyCiAgICAhCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5MwogICAgLy8gYmFyPWkgKyAxLAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTYKICAgIC8vIGM9aSA9PSAyLAogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mjk3CiAgICAvLyBkPWkgPT0gMywKICAgIGRpZyAzCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTgKICAgIC8vIGU9aSA9PSA0LAogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI5OQogICAgLy8gZj1pID09IDUsCiAgICBkaWcgNQogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAwCiAgICAvLyBnPWkgPT0gNiwKICAgIGRpZyA2CiAgICBwdXNoaW50IDYKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weToyOTAtMzAyCiAgICAvLyBhcnI3ID0gYXJyNy5hcHBlbmQoCiAgICAvLyAgICAgU2V2ZW5Cb29sVHVwbGUoCiAgICAvLyAgICAgICAgIGZvbz1pLAogICAgLy8gICAgICAgICBiYXI9aSArIDEsCiAgICAvLyAgICAgICAgIGE9aSA9PSAwLAogICAgLy8gICAgICAgICBiPWkgPT0gMSwKICAgIC8vICAgICAgICAgYz1pID09IDIsCiAgICAvLyAgICAgICAgIGQ9aSA9PSAzLAogICAgLy8gICAgICAgICBlPWkgPT0gNCwKICAgIC8vICAgICAgICAgZj1pID09IDUsCiAgICAvLyAgICAgICAgIGc9aSA9PSA2LAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICB1bmNvdmVyIDcKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDcKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCA2CiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgZHVwMgogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMxNAogICAgLy8gaD1pID09IDcsCiAgICBkaWcgNAogICAgcHVzaGludCA3CiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzAzLTMxNgogICAgLy8gYXJyOCA9IGFycjguYXBwZW5kKAogICAgLy8gICAgIEVpZ2h0Qm9vbFR1cGxlKAogICAgLy8gICAgICAgICBmb289aSwKICAgIC8vICAgICAgICAgYmFyPWkgKyAxLAogICAgLy8gICAgICAgICBhPWkgPT0gMCwKICAgIC8vICAgICAgICAgYj1pID09IDEsCiAgICAvLyAgICAgICAgIGM9aSA9PSAyLAogICAgLy8gICAgICAgICBkPWkgPT0gMywKICAgIC8vICAgICAgICAgZT1pID09IDQsCiAgICAvLyAgICAgICAgIGY9aSA9PSA1LAogICAgLy8gICAgICAgICBnPWkgPT0gNiwKICAgIC8vICAgICAgICAgaD1pID09IDcsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgNwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzI5CiAgICAvLyBpPWkgPT0gOCwKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDgKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMTctMzMxCiAgICAvLyBhcnI5ID0gYXJyOS5hcHBlbmQoCiAgICAvLyAgICAgTmluZUJvb2xUdXBsZSgKICAgIC8vICAgICAgICAgZm9vPWksCiAgICAvLyAgICAgICAgIGJhcj1pICsgMSwKICAgIC8vICAgICAgICAgYT1pID09IDAsCiAgICAvLyAgICAgICAgIGI9aSA9PSAxLAogICAgLy8gICAgICAgICBjPWkgPT0gMiwKICAgIC8vICAgICAgICAgZD1pID09IDMsCiAgICAvLyAgICAgICAgIGU9aSA9PSA0LAogICAgLy8gICAgICAgICBmPWkgPT0gNSwKICAgIC8vICAgICAgICAgZz1pID09IDYsCiAgICAvLyAgICAgICAgIGg9aSA9PSA3LAogICAgLy8gICAgICAgICBpPWkgPT0gOCwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgYnVyeSAzCiAgICBidXJ5IDEKICAgIGIgdGVzdF9iaXRfcGFja2VkX3R1cGxlc19mb3JfaGVhZGVyQDIKCnRlc3RfYml0X3BhY2tlZF90dXBsZXNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzMKICAgIC8vIGFzc2VydCBhcnIyLmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzQKICAgIC8vIGFzc2VydCBhcnI3Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzUKICAgIC8vIGFzc2VydCBhcnI4Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzYKICAgIC8vIGFzc2VydCBhcnI5Lmxlbmd0aCA9PSA1CiAgICBkaWcgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozMzcKICAgIC8vIHNlbGYuYm9vbDIgPSBhcnIyCiAgICBwdXNoYnl0ZXMgImJvb2wyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzM4CiAgICAvLyBzZWxmLmJvb2w3ID0gYXJyNwogICAgcHVzaGJ5dGVzICJib29sNyIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjMzOQogICAgLy8gc2VsZi5ib29sOCA9IGFycjgKICAgIHB1c2hieXRlcyAiYm9vbDgiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDAKICAgIC8vIHNlbGYuYm9vbDkgPSBhcnI5CiAgICBwdXNoYnl0ZXMgImJvb2w5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjI3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTAKICAgIC8vIHN1bTEgPSBzdW0yID0gc3VtMyA9IHN1bTQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUxCiAgICAvLyBmb3IgaSBpbiBhcnIxOgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMCAvLyAwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MQogICAgLy8gZm9yIGkgaW4gYXJyMToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDUKICAgIGRpZyA5CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTIKICAgIC8vIHN1bTEgKz0gaQogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1MwogICAgLy8gZm9yIGIgaW4gYXJyMjoKICAgIGRpZyA4CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTMKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzUzCiAgICAvLyBmb3IgYiBpbiBhcnIyOgogICAgZGlnIDEyCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDExCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTYKICAgICsKICAgIGRpZyA5CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NAogICAgLy8gaWYgYjoKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTUKICAgIC8vIHN1bTIgKz0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMwogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJANgoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTYKICAgIC8vIGZvciB0dXAgaW4gYXJyMzoKICAgIGRpZyA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfZm9yX2hlYWRlckAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1NgogICAgLy8gZm9yIHR1cCBpbiBhcnIzOgogICAgZGlnIDExCiAgICBkaWcgMTYKICAgIDwKICAgIGJ6IHN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5CiAgICBkaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgcHVzaGludCA5CiAgICAqCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBwdXNoaW50IDY0CiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2NQogICAgZ2V0Yml0CiAgICBidXJ5IDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTcKICAgIC8vIHN1bTMgKz0gdHVwLmZvbwogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNTgKICAgIC8vIGlmIHR1cC5iYXI6CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM1OQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYwCiAgICAvLyBpZiB0dXAuYmF6OgogICAgZGlnIDEwCiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2MQogICAgLy8gc3VtMyArPSAxCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQoKc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19hZnRlcl9pZl9lbHNlQDE3OgogICAgZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMgogICAgYiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMTIKCnN1bV91aW50c19hbmRfbGVuZ3Roc19hbmRfdHJ1ZXNfYWZ0ZXJfZm9yQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYyCiAgICAvLyBmb3IgaWR4LCBkeW5fdHVwIGluIHVlbnVtZXJhdGUoYXJyNCk6CiAgICBkaWcgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgMTUKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2Zvcl9oZWFkZXJAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjIKICAgIC8vIGZvciBpZHgsIGR5bl90dXAgaW4gdWVudW1lcmF0ZShhcnI0KToKICAgIGRpZyAxMwogICAgZGlnIDE1CiAgICA8CiAgICBieiBzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMwogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkaWcgMTgKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzYzCiAgICAvLyBzdW00ICs9IGR5bl90dXAuZm9vCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjQKICAgIC8vIHN1bTQgKz0gZHluX3R1cC5iYXIuYnl0ZXMubGVuZ3RoCiAgICBzd2FwCiAgICBsZW4KICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICBidXJ5IDkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM2NQogICAgLy8gYXNzZXJ0IGR5bl90dXAuYmFyLmJ5dGVzLmxlbmd0aCA9PSBpZHgsICJleHBlY3RlZCBzdHJpbmcgbGVuZ3RoIHRvIG1hdGNoIGluZGV4IgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN0cmluZyBsZW5ndGggdG8gbWF0Y2ggaW5kZXgKICAgIGJ1cnkgMTQKICAgIGIgc3VtX3VpbnRzX2FuZF9sZW5ndGhzX2FuZF90cnVlc19mb3JfaGVhZGVyQDIwCgpzdW1fdWludHNfYW5kX2xlbmd0aHNfYW5kX3RydWVzX2FmdGVyX2ZvckAyMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X3VpbnQ2NF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3VpbnQ2NF9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzEKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChVSW50NjQoMSksIFVJbnQ2NCgyKSwgVUludDY0KDMpKSkKICAgIHB1c2hieXRlcyAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X3VpbnQ2NF9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3MwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChpKQogICAgZHVwbiAyCiAgICBpdG9iCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzcyCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF91aW50NjRfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF91aW50NjRfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfYm9vbF9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfcmV0dXJuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc4CiAgICAvLyBhcnIgPSBJbW11dGFibGVBcnJheSgoVHJ1ZSwgRmFsc2UsIFRydWUsIEZhbHNlLCBUcnVlKSkKICAgIHB1c2hieXRlcyAweDAwMDVhOAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Jvb2xfcmV0dXJuX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM3OQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2Jvb2xfcmV0dXJuX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODAKICAgIC8vIGFyciA9IGFyci5hcHBlbmQoaSAlIDIgPT0gMCkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGludGNfMyAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGJ1cnkgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzc5CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9ib29sX3JldHVybl9mb3JfaGVhZGVyQDIKCnRlc3RfYm9vbF9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF90dXBsZV9yZXR1cm5bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X3R1cGxlX3JldHVybjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NQogICAgLy8gYXJyID0gSW1tdXRhYmxlQXJyYXkoKE15VHVwbGUoVUludDY0KCksIFRydWUsIEZhbHNlKSwpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDA4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzg2CiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoYXBwZW5kKToKICAgIGludGNfMCAvLyAwCgp0ZXN0X3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODYKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NwogICAgLy8gYXJyID0gYXJyLmFwcGVuZChNeVR1cGxlKGZvbz1pLCBiYXI9aSAlIDIgPT0gMCwgYmF6PWkgJSAzID09IDApKQogICAgZHVwbiAyCiAgICBpbnRjXzIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDEKICAgIHB1c2hpbnQgMwogICAgJQogICAgIQogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM4NgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfdHVwbGVfcmV0dXJuX2Zvcl9oZWFkZXJAMgoKdGVzdF90dXBsZV9yZXR1cm5fYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9keW5hbWljX3R1cGxlX3JldHVybltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY190dXBsZV9yZXR1cm46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTIKICAgIC8vIGFyciA9IEltbXV0YWJsZUFycmF5KChNeUR5bmFtaWNTaXplZFR1cGxlKFVJbnQ2NCgpLCBTdHJpbmcoIkhlbGxvIikpLCkpCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBhMDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTozOTMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogdGVzdF9keW5hbWljX3R1cGxlX3JldHVybl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk0CiAgICAvLyBhcnIgPSBhcnIuYXBwZW5kKE15RHluYW1pY1NpemVkVHVwbGUoaSwgdGltZXMoaSkpKQogICAgZHVwbiAyCiAgICBjYWxsc3ViIHRpbWVzCiAgICBkaWcgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMwogICAgaXRvYgogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDAwYQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5MwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHRlc3RfZHluYW1pY190dXBsZV9yZXR1cm5fZm9yX2hlYWRlckAyCgp0ZXN0X2R5bmFtaWNfdHVwbGVfcmV0dXJuX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6MzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29udmVydF90b19hcnJheV9hbmRfYmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjM5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMgogICAgLy8gbXV0YWJsZS5leHRlbmQoYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9jb252ZXJ0X3RvX2FycmF5X2FuZF9iYWNrX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwMwogICAgLy8gZm9yIGkgaW4gdXJhbmdlKGFwcGVuZCk6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNAogICAgLy8gbXV0YWJsZS5hcHBlbmQoTXlUdXBsZShmb289aSwgYmFyPWkgJSAyID09IDAsIGJhej1pICUgMyA9PSAwKSkKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICUKICAgICEKICAgIGRpZyAxCiAgICBwdXNoaW50IDMKICAgICUKICAgICEKICAgIGRpZyA0CiAgICBjb3ZlciAzCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDMKICAgIC8vIGZvciBpIGluIHVyYW5nZShhcHBlbmQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfZm9yX2hlYWRlckAyCgp0ZXN0X2NvbnZlcnRfdG9fYXJyYXlfYW5kX2JhY2tfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDA1CiAgICAvLyByZXR1cm4gbXV0YWJsZS5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOQogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6Mzk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDExCiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5VSW50NjQoMSksIGFyYzQuVUludDY0KDIpKSkKICAgIGJ5dGVjIDggLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxMgogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyMAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQxOQogICAgLy8gcHJlZml4ID0gSW1tdXRhYmxlQXJyYXkoKGFyYzQuVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSkpCiAgICBieXRlYyA4IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjAKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZHluYW1pY19jb25jYXRfd2l0aF9hcmM0X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDI4CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGV4dHJhY3QgNCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjcKICAgIC8vIHByZWZpeCA9IEltbXV0YWJsZUFycmF5KChhcmM0LlN0cmluZygiYSIpLCBhcmM0LlN0cmluZygiYiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgwMDAyMDAwNDAwMDcwMDAxNjEwMDAxNjIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQyOAogICAgLy8gcmVzdWx0ID0gcHJlZml4ICsgYXJnCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5pbW11dGFibGUuSW1tdXRhYmxlQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfY29uY2F0X3dpdGhfbmF0aXZlX3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2NvbmNhdF93aXRoX25hdGl2ZV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM2CiAgICAvLyByZXN1bHQgPSBwcmVmaXggKyBhcmcKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDM1CiAgICAvLyBwcmVmaXggPSBJbW11dGFibGVBcnJheSgoYXJjNC5TdHJpbmcoImEiKSwgYXJjNC5TdHJpbmcoImIiKSkpCiAgICBieXRlYyA5IC8vIDB4MDAwMjAwMDQwMDA3MDAwMTYxMDAwMTYyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0MzYKICAgIC8vIHJlc3VsdCA9IHByZWZpeCArIGFyZwogICAgc3dhcAogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9jb25jYXRfaW1tdXRhYmxlX2R5bmFtaWNbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2NvbmNhdF9pbW11dGFibGVfZHluYW1pYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ0MwogICAgLy8gcmV0dXJuIGltbTEgKyBpbW0yCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLmltbXV0YWJsZS5JbW11dGFibGVBcnJheUNvbnRyYWN0LnRlc3RfaW1tdXRhYmxlX2FyYzRbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2ltbXV0YWJsZV9hcmM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ3CiAgICAvLyBhc3NlcnQgaW1tLCAiZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5IgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbm9uIGVtcHR5IGFycmF5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NDgKICAgIC8vIGltbSA9IGltbS5yZXBsYWNlKGltbS5sZW5ndGggLSAxLCBpbW1bMF0pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAxNgogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuaW1tdXRhYmxlLkltbXV0YWJsZUFycmF5Q29udHJhY3QudGVzdF9pbW1fZml4ZWRfYXJyW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9pbW1fZml4ZWRfYXJyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDUzCiAgICAvLyBhcnIxID0gemVyb19ieXRlcyhOYXRpdmVTdHJ1Y3QzKQogICAgcHVzaGludCA0OAogICAgYnplcm8KICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU0CiAgICAvLyBzdHJ1Y3QxMiA9IE5hdGl2ZVN0cnVjdChUeG4ubnVtX2FwcF9hcmdzICsgMSwgVHhuLm51bV9hcHBfYXJncyArIDIpCiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1NQogICAgLy8gYXJyMiA9IE5hdGl2ZVN0cnVjdDMoKHN0cnVjdDEyLCBzdHJ1Y3QxMiwgc3RydWN0MTIpKQogICAgZHVwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDU3CiAgICAvLyBhc3NlcnQgYXJyMSAhPSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudCIKICAgICE9CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIGRpZmZlcmVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYwCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2MAogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDMpOgogICAgZHVwCiAgICBwdXNoaW50IDMKICAgIDwKICAgIGJ6IHRlc3RfaW1tX2ZpeGVkX2Fycl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYxCiAgICAvLyBhcnIxID0gYXJyMS5yZXBsYWNlKGksIHN0cnVjdDEyKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgZGlnIDUKICAgIHJlcGxhY2UzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjAKICAgIC8vIGZvciBpIGluIHVyYW5nZSgzKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJAMgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDYzCiAgICAvLyBhc3NlcnQgYXJyMSA9PSBhcnIyLCAiZXhwZWN0ZWQgYXJyYXlzIHRvIGJlIHRoZSBzYW1lIgogICAgZGlnIDMKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFycmF5cyB0byBiZSB0aGUgc2FtZQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ2NQogICAgLy8gZm9yIHN0cnVjdF9pdCBpbiBhcnIxOgogICAgZGlnIDQKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5CiAgICBkaWcgNAogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBkaWcgNQogICAgc3dhcAogICAgcHVzaGludCAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NjYKICAgIC8vIGFzc2VydCBzdHJ1Y3RfaXQgPT0gc3RydWN0MTIsICJleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUiCiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBpdGVtcyBvbiBpdGVyYXRpb24gdG8gYmUgdGhlIHNhbWUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDUKICAgIGIgdGVzdF9pbW1fZml4ZWRfYXJyX2Zvcl9oZWFkZXJANgoKdGVzdF9pbW1fZml4ZWRfYXJyX2FmdGVyX2ZvckA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDY4CiAgICAvLyBzZWxmLmltbV9maXhlZF9hcnIgPSBhcnIxCiAgICBieXRlYyAxMCAvLyAiaW1tX2ZpeGVkX2FyciIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzIKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDE1LCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDE1IgogICAgZHVwCiAgICBjYWxsc3ViIHN1bV9pbW1fZml4ZWQKICAgIHB1c2hpbnQgMTUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgc3VtIHRvIGJlIDE1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzQKICAgIC8vIG11dF9hcnJbMF0gPSBOYXRpdmVTdHJ1Y3QoVUludDY0KCksIFVJbnQ2NCgpKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDAgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL2ltbXV0YWJsZS5weTo0NzUKICAgIC8vIGFzc2VydCBzdW1faW1tX2ZpeGVkKG11dF9hcnIuZnJlZXplKCkpID09IDEwLCAiZXhwZWN0ZWQgc3VtIHRvIGJlIDEwIgogICAgY2FsbHN1YiBzdW1faW1tX2ZpeGVkCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHN1bSB0byBiZSAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9pbW11dGFibGUucHk6NDc3CiAgICAvLyByZXR1cm4gc2VsZi5pbW1fZml4ZWRfYXJyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImltbV9maXhlZF9hcnIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1tX2ZpeGVkX2FyciBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvaW1tdXRhYmxlLnB5OjQ1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCawNSBHwFNwXnBkwHfgizCLkIyAmlCsML9AxADHMMxQ0lDXQNjQ2pDbwN5Q4ODisAMRkUMRgUEEQjQ4oCAov+IlkjCRZXBgCL/kxcAEkVi/8JSov/WE8CIk8DUomKAQKL/yJZIwlJJAtJi/9XAgBJTgJJTwJZSU8CSRVMTgJSKCKLBosBDEEAG4sCiwZJTgJZJAkWVwYCiwVMUIwFJAiMBkL/3YsAFlcGAosFUIsBJAiLAkyLA1JQiwSMAIwBiYoEAShHAov8IllHAov+CEkWVwYAi/xMXABOAkyBBwglCklPAoEHCCUKSU4CDEEADIsGiwUJr4sETFCMBCKMAIsDgRAISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAImKAwGL/SJZSYv/CEwkCyQISwEWVwYCTgKL/SRLAlKL/yQLr1CL/RWL/U8DTwJSUIv+UEwkC0kiiwSLAgxBACOLA0kWVwYCiwGLBElOBE8CXUmMAUsBWSQICIwDJAiMBEL/1YsAiwFQjACJigQBKEmL/iQLi/wkCyKLBIsDDEEAHIv9iwRJTgJZiwIIFlcGAosBTFCMASQIjARC/9yL/RWMACKMBIsEiwIMQQAci/+LBElOAlmLAAgWVwYCiwFMUIwBJAiMBEL/3Iv8i/4IFlcGAosBUIv9iwOLAFJQi/8Vi/+LAk8CUlCMAImKAQEiSYsBgQMMQQAfiwFJgRALi/9MgRBYSSJbiwAITCVbCIwAIwiMAUL/2YmKAQEoIosBi/8MQQARiwCAASBQjACLASMIjAFC/+eJigIBIosAi/8MQQAdiwBJFov+TFCL/iJZIwgWVwYCXACM/iMIjABC/9uL/kyJgAoAAQAAAAAAAAAqgQWI/8JJIllJgQYSREkjCUsCVwIATCULW4EEEkSBKxZPAkxQTCMIFlcGAlwARwIiWUmBBxJEIwlLAVcCAEwlC1uBKxJEJFuBKhJEIkmBAwxBABFLASWI/TtFA0hJIwhFAUL/6EsBSSJZSYEEEkQjCUsBVwIATCULWyQSRIEKiP9GSSJZSYEOEkRJIwlLAlcCAEwlC1uBCRJEgSwWTwJMUEwjCBZXBgJcAEkiWUmBDxJEIwlLAVcCAEwlC1uBLBJEgRcWXBJJIlmBDxJESYESW4EXEkSAAWFMZyNDMRsjCRaBQK9JTgKrKkxQgAIAAVwARwIiWUkjEkQjCUxXAgBMgUALgUBYKKhEIkmBBQxBACBHAhZLBKtLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/2UsBSSJZSYEGEkRJIwlLAlcCAEyBQAuBQFiAAQSoRDEbFicFTKFJFYFADkRLBatPAkxQTCMIFlcGAlwASSJZSYEHEkRJIwlLAlcCAEyBQAuBQFiAQP////////////////////////////////////////////////////////////////////////////////////6oREsBVwJAKKhETCcFUEwjCBZXBgJcAEkiWUklEkQjCUsBVwIATIFAC4FAWCcFqERJVwJAKKhEJwe8SCcHTL8jQyg2GgEXKiJJSwMMQQAeMRtLAUlPAhIrIk8CVEsDTCMliPvwRQMjCEUBQv/bSwEiWUlFBUsDSU4CEkRBAApLA0RLAYEQUxRESwIjDUEADCNLBAxESwGBEVMUREsCJA1BAAskSwQMREsBgRJTREsCgQMNQQASSwIjCUlLBQxEgRAISwJMUxREgAFnSwJnSwJBAChLAyMJSRZXBgBLA0xcAEsBgRAIIlRMgQcIJQokCCJMUiJZSwMjCRJEI0MqIkmBBQxBACVHAiMITCQISwEWTBZQSwNJTwJQTCJZIwgWVwYCXABFA0UBQv/USwFJIllJgQUSREsBVwIASwJXAhBJIltMJVtMIxJMJBIQREwjCYEQC4EQWEkiW0wlW0yBBRJMgQYSEESBEIj6ZkUBSSJZSYEEEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQQSTIEFEhBEgAFjTGcjQyoiSYEFDEEANEcCJBgUSwGBAwskGBRLAhYrIk8EVCNPA1RQSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/8VLAUkiWYEFEkRJVwIJSSJbSwGBQFNPAoFBU08CFERMRESAAWRMZyNDKCoiSYEFDEEANUcCIwhMr0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+u5FA0UBQv/ESwEiWUlFBIEFEkQiRQFJgQUMQQBPSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJEFU8CEkRFAUL/qksBiPk5RQFJIllJgQQSREsBVwIASSJZSwIjCUsCFUsDJFlLAUxLA01LBE8ETwJSSSJbSwElWUsCFU8DTgJSVwIATCMSIq9PAhIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSgQOvTwISEESAAWVMZyNDKCoiSYEFDEEAN0cCIwhMiPqPSwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j5ukUDRQFC/8JLASJZSUUEgQUSRCJFAUmBBQxBAFFLAVcCAEsBSU4CJAtLAUxZSwIjCEsGSwEJSwMVSwIkC0sFTFlPAk1PA08DTwJSSSJbSwElWUsCFU8DTgJSVwIATEsCEkRPAoj6ARJERQFC/6hLAYj4A0UBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEkwoEhBESwEkC0sDTFlPAiMITwRLAQlMJAtLBExZTwNMTwJNUkkiW0sBJVlLAhVPA04CUlcCAEyBBBJMgAMgICASEESAAWZMZyNDNhoBsCNDgAb6QMBTAAI2GgFQsCNDIkcCKEcFNhoBFzYaAiJJSwMMQQBMKkUMIkUFSwRLAQxBAB5LBEkWSw1JTwJQTCJZIwgWVwYCXABFDSMIRQVC/9pLAUkiWUxXAgAnBEsOUE4CI08DiPhTRQJJIwhFAUL/rSpFCksBIllFCSJFB0sGSwkMQQBhSwFXAgBLByQLSwFMWUpZJQskCFhJRQwiRQUiWUUIIkUGSwVLCAxBABlLClcCAEsGSU4CJQtbSwUIRQUjCEUGQv/fSwMWSwpJTwJQTCJZIwgWVwYCXABFCksGIwhFB0L/lylLClCwI0MqRwMiSYEFDEEAxkcCFEsBIxIrIk8DVCNPAlRLBklOAksBUE8CIlkjCBZXBgJcAEUHSwEjCEsCJBJLA4EDEksEgQQSSwWBBRJLBoEGEksHFk8HJE8HVIEDTwZUgQRPBVSBBU8EVIEGTwNUSlBLAxZMSwFQSwlJTwJQTCJZIwgWVwYCXABFCUsEgQcSTwKBB08CVE8CTFBJSwJQSwdJTwJQTCJZIwgWVwYCXABFB08DJRIrIk8CVFBMUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/M0sESSJZgQUSREsESSJZgQUSREsESSJZgQUSREsESSJZgQUSRIAFYm9vbDJPBGeABWJvb2w3TwNngAVib29sOE8CZ4AFYm9vbDlMZyNDKEcGNhoBNhoCNhoDNhoEIkcDNhoBIlkiSUsCDEEAGUsJVwIASwFJTgIlC1tLBAhFBCMIRQFC/+BLCCJZRREiRQ1LDEsRDEEAG0sMgRAISwlMU0EABksDIwhFBEsMIwhFDUL/3UsHIllFECJFDEsLSxAMQQBASwdXAgBLDIEJC4EJWEkiW0sBgUBTTwKBQVNFDUsGTwIIRQZBAAZLBCMIRQVLCkEABksEIwhFBUsLIwhFDEL/uEsGIllFDyJFDksNSw8MQQBWSwZXAgBLDklOAiQLSwFMWUsCIwhLEksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAEsJTwIITBVMSwEIRQlPAhJERQ5C/6JLAhZLBBZQSwUWUEsGFlApTFCwI0M2GgEXgBoAAwAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAyJJSwMMQQAdRwIWSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9wpSwJQsCNDNhoBF4ADAAWoIklLAwxBABtHAiQYFCsiTwJUSwNMIyWI9CxFAyMIRQFC/94pSwJQsCNDNhoBF4ALAAEAAAAAAAAAAIAiSUsDDEEAMkcCJBgUSwGBAxgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/HKUsCULAjQzYaAReAFQABAAIAAAAAAAAAAAAKAAVIZWxsbyJJSwMMQQA2RwKI9TJLA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPRdRQMjCEUBQv/DKUsCULAjQzYaATYaAhdMVwIAIklLAwxBAClHAiQYFEsBgQMYFEsETgNLAhYrIk8EVCNPA1RQTwJMUEUDIwhFAUL/0EsBSRWBCQoWVwYCTFApTFCwI0MnCDYaAVBJVwIAFSUKFlcGAlwAKUxQsCNDNhoBSVcACExXCAhQJwhMUIACAARcAClMULAjQzYaAVcEACcJTCSI81IpTFCwI0M2GgFJIllLASRZSwJPAksCUksCFU8DTwNPAlJQJwlMJIjzKSlMULAjQzYaATYaAksBIllPAlcCAEsCVwIATwMiWU8DTwNPAk8DiPNqKUxQsCNDNhoBSSJZSUQjCUsBVwIQTIEQCyQITF0pTFCwI0MogTCvSTEbIwgxGyQITBZMFlBJTgJJSwFQTFBJTgITRCJJgQMMQQAURwKBEAtLBUxLBV1FBSMIRQFC/+VLA0sCEkQiRQVLBIEDDEEAF0sESYEQC0sFTIEQWEsEEkQjCEUFQv/hJwpLBElOAmdJiPNXgQ8SRIAQAAAAAAAAAAAAAAAAAAAAAFwAiPM8gQoSRCInCmVEKUxQsCND", + "approval": "CyAEAAECCCYLAAQVH3x1AgAAAQACAAJA/////////////////////////////////////////////////////////////////////////////////////wIACgdiaWd1aW50EgACAAAAAAAAAAEAAAAAAAAAAgwAAgAEAAcAAWEAAWINaW1tX2ZpeGVkX2FycjEbQQC3MRkURDEYRIIYBETUL5kEt+qmCwR0PXDtBBx+BJQEotWGCwTgX8VkBB4JK4MEATECYgTIZUqYBInRlvgEbLfJkQSYmL8CBPa2HugEYLhqewRzrSg/BFKd+ukEIG1RTwTgZGXiBOwDAKIE7N8UrwRRGspkBCmFLk8EbUqjWAS3y5a9NhoAjhgCaQNQBHoFNQXlBkoHfAixCLcIxgmjCsEL8gw+DHEMww0jDXINiw2nDboN4w4MDikAMRkUMRgUEEOKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUigiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJQpJTwKBBwglCklOAgxBAAyLBosFCa+LBExQjAQijACLA4EQCEmMAov+CIwBiwKLAQxBACCL/YsASU4CU4sEiwJJTgNPAlSMBCMIjAKL/wiMAEL/2IsEjACJigMBi/0iWUmL/whMJAskCEsBFlcGAk4Ci/0kSwJSi/8kC69Qi/0Vi/1PA08CUlCL/lBMJAtJIosEiwIMQQAjiwNJFlcGAosBiwRJTgRPAl1JjAFLAVkkCAiMAyQIjARC/9WLAIsBUIwAiYoEAShJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigEBIkmLAYEDDEEAH4sBSYEQC4v/TIEQWEkiW4sACEwlWwiMACMIjAFC/9mJigEBKCKLAYv/DEEAEYsAgAEgUIwAiwEjCIwBQv/niYoCASKLAIv/DEEAHYsASRaL/kxQi/4iWSMIFlcGAlwAjP4jCIwAQv/bi/5MiYAKAAEAAAAAAAAAKoEFiP/CSSJZSYEGEkRJIwlLAlcCAEwlC1uBBBJEgSsWTwJMUEwjCBZXBgJcAEcCIllJgQcSRCMJSwFXAgBMJQtbgSsSRCRbgSoSRCJJgQMMQQARSwEliP07RQNISSMIRQFC/+hLAUkiWUmBBBJEIwlLAVcCAEwlC1skEkSBCoj/RkkiWUmBDhJESSMJSwJXAgBMJQtbgQkSRIEsFk8CTFBMIwgWVwYCXABJIllJgQ8SRCMJSwFXAgBMJQtbgSwSRIEXFlwSSSJZgQ8SREmBEluBFxJEgAFhTGcjQzEbIwkWgUCvSU4CqypMUIACAAFcAEcCIllJIxJEIwlMVwIATIFAC4FAWCioRCJJgQUMQQAgRwIWSwSrSwNJTwJQTCJZIwgWVwYCXABFAyMIRQFC/9lLAUkiWUmBBhJESSMJSwJXAgBMgUALgUBYgAEEqEQxGxYnBUyhSRWBQA5ESwWrTwJMUEwjCBZXBgJcAEkiWUmBBxJESSMJSwJXAgBMgUALgUBYgED////////////////////////////////////////////////////////////////////////////////////+qERLAVcCQCioREwnBVBMIwgWVwYCXABJIllJJRJEIwlLAVcCAEyBQAuBQFgnBahESVcCQCioRCcHvEgnB0y/I0MoNhoBFyoiSUsDDEEAHjEbSwFJTwISKyJPAlRLA0wjJYj78EUDIwhFAUL/20sBIllJRQVLA0lOAhJEQQAKSwNESwGBEFMUREsCIw1BAAwjSwQMREsBgRFTFERLAiQNQQALJEsEDERLAYESU0RLAoEDDUEAEksCIwlJSwUMRIEQCEsCTFMURIABZ0sCZ0sCQQAoSwMjCUkWVwYASwNMXABLAYEQCCJUTIEHCCUKJAgiTFIiWUsDIwkSRCNDKiJJgQUMQQAlRwIjCEwkCEsBFkwWUEsDSU8CUEwiWSMIFlcGAlwARQNFAUL/1EsBSSJZSYEFEkRLAVcCAEsCVwIQSSJbTCVbTCMSTCQSEERMIwmBEAuBEFhJIltMJVtMgQUSTIEGEhBEgRCI+mZFAUkiWUmBBBJESwFXAgBLAlcCEEkiW0wlW0wjEkwkEhBETCMJgRALgRBYSSJbTCVbTIEEEkyBBRIQRIABY0xnI0MqIkmBBQxBADRHAiQYFEsBgQMLJBgUSwIWKyJPBFQjTwNUUEsDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/FSwFJIlmBBRJESVcCCUkiW0sBgUBTTwKBQVNPAhRETEREgAFkTGcjQygqIkmBBQxBADVHAiMITK9LA0kiWUxXAgBLAxZLAxUWVwYCTwRQTCcGUExQJwRMUE4CI08DiPruRQNFAUL/xEsBIllJRQSBBRJEIkUBSYEFDEEAT0sBVwIASwFJTgIkC0sBTFlLAiMISwZLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBMSwISRBVPAhJERQFC/6pLAYj5OUUBSSJZSYEEEkRLAVcCAEkiWUsCIwlLAhVLAyRZSwFMSwNNSwRPBE8CUkkiW0sBJVlLAhVPA04CUlcCAEwjEiKvTwISEERLASQLSwNMWU8CIwhPBEsBCUwkC0sETFlPA0xPAk1SSSJbSwElWUsCFU8DTgJSVwIATIEEEoEDr08CEhBEgAFlTGcjQygqIkmBBQxBADdHAiMITIj6j0sDSSJZTFcCAEsDFksDFRZXBgJPBFBMJwZQTFAnBExQTgIjTwOI+bpFA0UBQv/CSwEiWUlFBIEFEkQiRQFJgQUMQQBRSwFXAgBLAUlOAiQLSwFMWUsCIwhLBksBCUsDFUsCJAtLBUxZTwJNTwNPA08CUkkiW0sBJVlLAhVPA04CUlcCAExLAhJETwKI+gESREUBQv+oSwGI+ANFAUkiWUmBBBJESwFXAgBJIllLAiMJSwIVSwMkWUsBTEsDTUsETwRPAlJJIltLASVZSwIVTwNOAlJXAgBMIxJMKBIQREsBJAtLA0xZTwIjCE8ESwEJTCQLSwRMWU8DTE8CTVJJIltLASVZSwIVTwNOAlJXAgBMgQQSTIADICAgEhBEgAFmTGcjQzYaAbAjQ4AG+kDAUwACNhoBULAjQyJHAihHBTYaARc2GgIiSUsDDEEATCpFDCJFBUsESwEMQQAeSwRJFksNSU8CUEwiWSMIFlcGAlwARQ0jCEUFQv/aSwFJIllMVwIAJwRLDlBOAiNPA4j4U0UCSSMIRQFC/60qRQpLASJZRQkiRQdLBksJDEEAYUsBVwIASwckC0sBTFlKWSULJAhYSUUMIkUFIllFCCJFBksFSwgMQQAZSwpXAgBLBklOAiULW0sFCEUFIwhFBkL/30sDFksKSU8CUEwiWSMIFlcGAlwARQpLBiMIRQdC/5cpSwpQsCNDKkcDIkmBBQxBAMZHAhRLASMSKyJPA1QjTwJUSwZJTgJLAVBPAiJZIwgWVwYCXABFB0sBIwhLAiQSSwOBAxJLBIEEEksFgQUSSwaBBhJLBxZPByRPB1SBA08GVIEETwVUgQVPBFSBBk8DVEpQSwMWTEsBUEsJSU8CUEwiWSMIFlcGAlwARQlLBIEHEk8CgQdPAlRPAkxQSUsCUEsHSU8CUEwiWSMIFlcGAlwARQdPAyUSKyJPAlRQTFBLA0lPAlBMIlkjCBZXBgJcAEUDRQFC/zNLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkRLBEkiWYEFEkSABWJvb2wyTwRngAVib29sN08DZ4AFYm9vbDhPAmeABWJvb2w5TGcjQyhHBjYaATYaAjYaAzYaBCJHAzYaASJZIklLAgxBABlLCVcCAEsBSU4CJQtbSwQIRQQjCEUBQv/gSwgiWUURIkUNSwxLEQxBABtLDIEQCEsJTFNBAAZLAyMIRQRLDCMIRQ1C/91LByJZRRAiRQxLC0sQDEEAQEsHVwIASwyBCQuBCVhJIltLAYFAU08CgUFTRQ1LBk8CCEUGQQAGSwQjCEUFSwpBAAZLBCMIRQVLCyMIRQxC/7hLBiJZRQ8iRQ5LDUsPDEEAVksGVwIASw5JTgIkC0sBTFlLAiMISxJLAQlLAxVLAiQLSwVMWU8CTU8DTwNPAlJJIltLASVZSwIVTwNOAlJXAgBLCU8CCEwVTEsBCEUJTwISREUOQv+iSwIWSwQWUEsFFlBLBhZQKUxQsCNDNhoBF4AaAAMAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAMiSUsDDEEAHUcCFksDSU8CUEwiWSMIFlcGAlwARQMjCEUBQv/cKUsCULAjQzYaAReAAwAFqCJJSwMMQQAbRwIkGBQrIk8CVEsDTCMliPQsRQMjCEUBQv/eKUsCULAjQzYaAReACwABAAAAAAAAAACAIklLAwxBADJHAiQYFEsBgQMYFEsCFisiTwRUI08DVFBLA0lPAlBMIlkjCBZXBgJcAEUDIwhFAUL/xylLAlCwI0M2GgEXgBUAAQACAAAAAAAAAAAACgAFSGVsbG8iSUsDDEEANkcCiPUySwNJIllMVwIASwMWSwMVFlcGAk8EUEwnBlBMUCcETFBOAiNPA4j0XUUDIwhFAUL/wylLAlCwI0M2GgE2GgIXTFcCACJJSwMMQQApRwIkGBRLAYEDGBRLBE4DSwIWKyJPBFQjTwNUUE8CTFBFAyMIRQFC/9BLAUkVgQkKFlcGAkxQKUxQsCNDJwg2GgFQSVcCABUlChZXBgJcAClMULAjQzYaAUlXAAhMVwgIUCcITFCAAgAEXAApTFCwI0M2GgFXBAAnCUwkiPNSKUxQsCNDNhoBSSJZSwEkWUsCTwJLAlJLAhVPA08DTwJSUCcJTCSI8ykpTFCwI0M2GgE2GgJLASJZTwJXAgBLAlcCAE8DIllPA08DTwJPA4jzailMULAjQzYaAUkiWUlEIwlLAVcCEEyBEAskCExdKUxQsCNDKIEwr0kxGyMIMRskCEwWTBZQSU4CSUsBUExQSU4CE0QiSYEDDEEAFEcCgRALSwVMSwVdRQUjCEUBQv/lSwNLAhJEIkUFSwSBAwxBABdLBEmBEAtLBUyBEFhLBBJEIwhFBUL/4ScKSwRJTgJnSYjzV4EPEkSAEAAAAAAAAAAAAAAAAAAAAABcAIjzPIEKEkQiJwplRClMULAjQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [ diff --git a/tests/artifacts/Arrays/data/ImmutableArrayContract.clear.teal b/tests/artifacts/Arrays/data/ImmutableArrayContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Arrays/data/ImmutableArrayContract.clear.teal +++ b/tests/artifacts/Arrays/data/ImmutableArrayContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal b/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal index 9bc9213e..7d6b884e 100644 --- a/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal +++ b/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal @@ -20,7 +20,7 @@ main_after_if_else@2: bz main___algopy_default_create@16 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x28d7c1b8 0xfa9cb973 0x6039a240 0xf8fd68a7 0x1f028db1 0x096b3a59 0x8d6e3a25 // method "test_array(uint64,uint64,uint64,uint64)uint64", method "test_extend_from_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]", method "test_extend_from_arc4_tuple(((uint64,uint64),(uint64,uint64)))(uint64,uint64)[]", method "test_bool_array(uint64)uint64", method "test_arc4_conversion(uint64)uint64[]", method "sum_array(uint64[])uint64", method "test_arc4_bool()bool[]" @@ -34,8 +34,6 @@ main___algopy_default_create@16: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_1 // 1 return @@ -58,13 +56,13 @@ dynamic_array_concat_bits: replace2 0 cover 2 swap - pushint 7 // 7 + pushint 7 + intc_2 // 8 / dup uncover 2 - pushint 7 // 7 + pushint 7 + intc_2 // 8 / @@ -171,10 +169,10 @@ test_array: concat dig 11 len - pushint 64 // 64 + pushint 64 <= assert // overflow - pushint 64 // 64 + pushint 64 bzero uncover 12 dig 1 @@ -201,7 +199,7 @@ test_array: concat dig 9 len - pushint 64 // 64 + pushint 64 <= assert // overflow uncover 9 @@ -226,7 +224,7 @@ test_array: concat dig 4 len - pushint 64 // 64 + pushint 64 <= assert // overflow uncover 4 @@ -243,7 +241,7 @@ test_array_for_header@2: // tests/artifacts/Arrays/static_size.py:51 // for i in urange(3): dup - pushint 3 // 3 + pushint 3 < bz test_array_after_for@5 // tests/artifacts/Arrays/static_size.py:52 @@ -273,7 +271,7 @@ test_array_for_header@2: dup extract 0 8 uncover 3 - pushint 2 // 2 + pushint 2 + itob b== @@ -523,10 +521,6 @@ test_extend_from_arc4_tuple: // tests/artifacts/Arrays/static_size.py:69 // @arc4.abimethod() txna ApplicationArgs 1 - // tests/artifacts/Arrays/static_size.py:74 - // arr.extend(some_more) - dup - pop // tests/artifacts/Arrays/static_size.py:75 // return arr.freeze() dup @@ -576,7 +570,7 @@ test_bool_array_for_header@2: // tests/artifacts/Arrays/static_size.py:83 // arr.append(i % 2 == 0) dupn 2 - pushint 2 // 2 + pushint 2 % ! dig 4 @@ -613,7 +607,7 @@ test_bool_array_after_for@5: // assert arr2.length == length * 2, "expected correct length" len uncover 2 - pushint 2 // 2 + pushint 2 * == assert // expected correct length @@ -890,14 +884,14 @@ test_arc4_bool: dup cover 3 dup - pushint 2 // 2 + pushint 2 == assert // expected correct length // tests/artifacts/Arrays/static_size.py:149 // assert dyn_arr.bytes.length == 3, "expected 3 bytes" dig 1 len - pushint 3 // 3 + pushint 3 == assert // expected 3 bytes // tests/artifacts/Arrays/static_size.py:150 @@ -923,7 +917,7 @@ test_arc4_bool: intc_1 // 1 > assert // index access is out of bounds - pushint 17 // 17 + pushint 17 getbit bytec_3 // 0x00 intc_0 // 0 @@ -974,7 +968,7 @@ test_arc4_bool_after_for@5: // assert arr2.length == 4, "expected correct length" dup len - pushint 4 // 4 + pushint 4 == assert // expected correct length // tests/artifacts/Arrays/static_size.py:159 diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json index 3996cce9..28fa8c41 100644 --- a/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +++ b/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json @@ -201,107 +201,95 @@ "sourceInfo": [ { "pc": [ - 44 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 112 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 1192, - 1209, - 1219 + 1188, + 1205, + 1215 ], "errorMessage": "check self.count exists" }, { "pc": [ - 1037 + 1033 ], "errorMessage": "expected 3 bytes" }, { "pc": [ - 754, - 765, - 865, - 1030, - 1119 + 750, + 761, + 861, + 1026, + 1115 ], "errorMessage": "expected correct length" }, { "pc": [ - 1057, - 1132 + 1053, + 1128 ], "errorMessage": "expected correct value at 0" }, { "pc": [ - 1077, - 1145 + 1073, + 1141 ], "errorMessage": "expected correct value at 1" }, { "pc": [ - 1158 + 1154 ], "errorMessage": "expected correct value at 2" }, { "pc": [ - 1170 + 1166 ], "errorMessage": "expected correct value at 3" }, { "pc": [ - 405, - 480, - 519, - 639, - 667, - 788, - 887, - 1039, - 1060, - 1121, - 1134, - 1147, - 1159 + 403, + 478, + 517, + 637, + 665, + 784, + 883, + 1035, + 1056, + 1117, + 1130, + 1143, + 1155 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 655, - 1022 + 653, + 1018 ], "errorMessage": "invalid array length header" }, { "pc": [ - 733, - 757, - 844, - 912, - 1003, - 1102 + 729, + 753, + 840, + 908, + 999, + 1098 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 285, - 344, - 379 + 283, + 342, + 377 ], "errorMessage": "overflow" } @@ -314,19 +302,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MjhkN2MxYjggMHhmYTljYjk3MyAweDYwMzlhMjQwIDB4ZjhmZDY4YTcgMHgxZjAyOGRiMSAweDA5NmIzYTU5IDB4OGQ2ZTNhMjUgLy8gbWV0aG9kICJ0ZXN0X2FycmF5KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZXh0ZW5kX2Zyb21fdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUoKCh1aW50NjQsdWludDY0KSwodWludDY0LHVpbnQ2NCkpKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJ0ZXN0X2Jvb2xfYXJyYXkodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2NvbnZlcnNpb24odWludDY0KXVpbnQ2NFtdIiwgbWV0aG9kICJzdW1fYXJyYXkodWludDY0W10pdWludDY0IiwgbWV0aG9kICJ0ZXN0X2FyYzRfYm9vbCgpYm9vbFtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdGVzdF9hcnJheSB0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlIHRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZSB0ZXN0X2Jvb2xfYXJyYXkgdGVzdF9hcmM0X2NvbnZlcnNpb24gc3VtX2FycmF5IHRlc3RfYXJjNF9ib29sCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMoYXJyYXk6IGJ5dGVzLCBuZXdfaXRlbXNfYnl0ZXM6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgcmVhZF9zdGVwOiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzOgogICAgcHJvdG8gNCAxCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NCAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NCAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NCAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NCAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBieiB0ZXN0X2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUyCiAgICAvLyBhc3NlcnQgcGF0aFtpXS5vdGhlci5iID09IGkgKyAxCiAgICBkdXAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGMgNCAvLyAxNDQKICAgICoKICAgIGludGMgNCAvLyAxNDQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAxNiAxMjgKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUzCiAgICAvLyBhc3NlcnQgcGF0aFtpXS5vdGhlci5kLmZvbyA9PSBpICsgMgogICAgc3dhcAogICAgZXh0cmFjdCA0OCAxNgogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgaXRvYgogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTQKICAgIC8vIGFzc2VydCBwYXRoW2ldLm90aGVyLmQuYmFyID09IChpICsgMSkgKiAoaSArIDEpCiAgICBleHRyYWN0IDggOAogICAgZGlnIDEKICAgIGRpZyAyCiAgICAqCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgYnVyeSAxCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2FycmF5X2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NTYKICAgIC8vIEJveChJbW11dGFibGVBcnJheVtQb2ludF0sIGtleT0iYSIpLnZhbHVlID0gcGF0aC5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGludGMgNCAvLyAxNDQKICAgIC8KICAgIGR1cAogICAgYnVyeSAxMAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAiYSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgcHVzaGJ5dGVzICJhIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjkKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBleHRyYWN0IDAgMTQ0IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDExCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBidXJ5IDEwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzAKICAgIC8vIGxlbmd0aCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MQogICAgLy8gZm9yIHBvaW50X2lkeCBpbiB1cmFuZ2UoMSwgcGF0aC5sZW5ndGgpOgogICAgaW50Y18xIC8vIDEKICAgIGJ1cnkgMwoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MQogICAgLy8gZm9yIHBvaW50X2lkeCBpbiB1cmFuZ2UoMSwgcGF0aC5sZW5ndGgpOgogICAgZGlnIDIKICAgIGRpZyA4CiAgICA8CiAgICBieiB0ZXN0X2FycmF5X2FmdGVyX2ZvckAxNQogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcyCiAgICAvLyBwb2ludCA9IHBhdGhbcG9pbnRfaWR4XQogICAgZGlnIDMKICAgIGludGMgNCAvLyAxNDQKICAgICoKICAgIGludGMgNCAvLyAxNDQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTczCiAgICAvLyBpZiBwb2ludC54IDwgbGFzdF9wb2ludC54OgogICAgZGlnIDEwCiAgICBiPAogICAgYnogdGVzdF9hcnJheV9lbHNlX2JvZHlAMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc0CiAgICAvLyBkeCA9IGxhc3RfcG9pbnQueC5hc191aW50NjQoKSAtIHBvaW50LnguYXNfdWludDY0KCkKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjkKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzQKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcyCiAgICAvLyBwb2ludCA9IHBhdGhbcG9pbnRfaWR4XQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc0CiAgICAvLyBkeCA9IGxhc3RfcG9pbnQueC5hc191aW50NjQoKSAtIHBvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBidXJ5IDcKCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc3CiAgICAvLyBpZiBwb2ludC55IDwgbGFzdF9wb2ludC55OgogICAgZGlnIDMKICAgIGRpZyA2CiAgICA8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzgKICAgIC8vIGR5ID0gbGFzdF9wb2ludC55IC0gcG9pbnQueQogICAgZGlnIDUKICAgIGRpZyA0CiAgICAtCgp0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE4MQogICAgLy8gbGVuZ3RoICs9IG9wLnNxcnQoZHggKiBkeCArIGR5ICogZHkpCiAgICBkaWcgNwogICAgZHVwCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgICoKICAgICsKICAgIHNxcnQKICAgIGRpZyA1CiAgICArCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcxCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiB0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANwoKdGVzdF9hcnJheV9lbHNlX2JvZHlAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE4MAogICAgLy8gZHkgPSBwb2ludC55IC0gbGFzdF9wb2ludC55CiAgICBkaWcgMwogICAgZGlnIDYKICAgIC0KICAgIGIgdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcyCiAgICAvLyBwb2ludCA9IHBhdGhbcG9pbnRfaWR4XQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc2CiAgICAvLyBkeCA9IHBvaW50LnguYXNfdWludDY0KCkgLSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMTAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTY5CiAgICAvLyBsYXN0X3BvaW50ID0gcGF0aFswXQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTc2CiAgICAvLyBkeCA9IHBvaW50LnguYXNfdWludDY0KCkgLSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBidXJ5IDcKICAgIGIgdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExCgp0ZXN0X2FycmF5X2FmdGVyX2ZvckAxNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgNAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgZXh0cmFjdCAwIDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDE2IDE2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjYyCiAgICAvLyBhcnIuZXh0ZW5kKHNvbWVfbW9yZSkKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjMKICAgIC8vIGxhc3QgPSBhcnJbLTFdCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gMTYKICAgICoKICAgIGRpZyAyCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NAogICAgLy8gYXNzZXJ0IGxhc3QgPT0gc29tZV9tb3JlWzFdCiAgICBkdXAKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NQogICAgLy8gcmVzdWx0ID0gYXJyLmZyZWV6ZSgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjYKICAgIC8vIGFzc2VydCByZXN1bHRbLTFdID09IGxhc3QKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgKgogICAgaW50Y18zIC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NAogICAgLy8gYXJyLmV4dGVuZChzb21lX21vcmUpCiAgICBkdXAKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NQogICAgLy8gcmV0dXJuIGFyci5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAxNgogICAgLwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2Jvb2xfYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2Jvb2xfYXJyYXk6CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NzkKICAgIC8vIGFyciA9IFJlZmVyZW5jZUFycmF5W2Jvb2xdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODIKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzEgLy8gMQoKdGVzdF9ib29sX2FycmF5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODIKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MwogICAgLy8gYXJyLmFwcGVuZChpICUgMiA9PSAwKQogICAgZHVwbiAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MAogICAgLy8gY291bnQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTEKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgbGVuCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKCnRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGRpZyA0CiAgICBkaWcgNwogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckAxMQogICAgZGlnIDIKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkyCiAgICAvLyBpZiB2YWw6CiAgICBieiB0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkzCiAgICAvLyBjb3VudCArPSAxCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNgoKdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOToKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfYm9vbF9hcnJheV9mb3JfaGVhZGVyQDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDUKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FyYzRfY29udmVyc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jb252ZXJzaW9uOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk4CiAgICAvLyBhcnIgPSBSZWZlcmVuY2VBcnJheVthcmM0LlVJbnQ2NF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzEgLy8gMQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMgogICAgLy8gYXJyLmFwcGVuZChhcmM0LlVJbnQ2NChpKSkKICAgIGR1cG4gMgogICAgaXRvYgogICAgZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMQogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckA1OgogICAgZGlnIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAzCiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgYnVyeSA4CiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDQKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMQogICAgZGlnIDIKICAgIGRpZyA1CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDYKICAgIC8vIGlmIHZhbDoKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGIhPQogICAgYnogdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwNwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOToKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA1CiAgICBiIHRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJANgoKdGVzdF9hcmM0X2NvbnZlcnNpb25fYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDkKICAgIC8vIGFyYzRfYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTAKICAgIC8vIGFyYzRfYXJyLmV4dGVuZChhcnIpCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnN1bV9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1bV9hcnJheToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTcKICAgIC8vIGFyci5leHRlbmQoYXJjNF9hcnIpCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExOQogICAgLy8gdG90YWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgaW50Y18wIC8vIDAKCnN1bV9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMAogICAgLy8gZm9yIGl0ZW0gaW4gYXJyOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogc3VtX2FycmF5X2FmdGVyX2ZvckA1CiAgICBkaWcgMwogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTIxCiAgICAvLyB0b3RhbCArPSBpdGVtLmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgICsKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYXJyYXlfZm9yX2hlYWRlckAyCgpzdW1fYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQzCiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDQKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5Cb29sKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSkKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDYKICAgIC8vIGR5bl9hcnIgPSBhcmM0LkR5bmFtaWNBcnJheVthcmM0LkJvb2xdKCkKICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0NwogICAgLy8gZHluX2Fyci5leHRlbmQoYXJyKQogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OAogICAgLy8gYXNzZXJ0IGR5bl9hcnIubGVuZ3RoID09IDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDkKICAgIC8vIGFzc2VydCBkeW5fYXJyLmJ5dGVzLmxlbmd0aCA9PSAzLCAiZXhwZWN0ZWQgMyBieXRlcyIKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTUwCiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MQogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcgLy8gMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTQtMTU2CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTcKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU4CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1OQogICAgLy8gYXNzZXJ0IGFycjJbMF0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMCIKICAgIGR1cAogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjAKICAgIC8vIGFzc2VydCBhcnIyWzFdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEiCiAgICBkdXAKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTYxCiAgICAvLyBhc3NlcnQgYXJyMlsyXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyIgogICAgZHVwCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MgogICAgLy8gYXNzZXJ0IGFycjJbM10gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMyIKICAgIGV4dHJhY3QgMyAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICAhPQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMKICAgIGRpZyA0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2NAogICAgLy8gcmV0dXJuIGFyci5mcmVlemUoKQogICAgZHVwCiAgICBsZW4KICAgIGJ5dGVjIDQgLy8gMHgwMDAwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC54dHJhKCkgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6Cnh0cmE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyNwogICAgLy8gc2VsZi5jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI5CiAgICAvLyBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICB0eG4gTnVtQXBwQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzEKICAgIC8vIGM9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMyCiAgICAvLyBkPXNlbGYubW9yZSgpLAogICAgY2FsbHN1YiBtb3JlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMwogICAgLy8gZT1CaWdVSW50KHNlbGYuY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjgtMTM0CiAgICAvLyByZXR1cm4gWHRyYSgKICAgIC8vICAgICBhPVR4bi5udW1fYXBwX2FyZ3MsCiAgICAvLyAgICAgYj1zZWxmLmNvdW50LAogICAgLy8gICAgIGM9VHhuLnNlbmRlciwKICAgIC8vICAgICBkPXNlbGYubW9yZSgpLAogICAgLy8gICAgIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgY292ZXIgNAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QubW9yZSgpIC0+IGJ5dGVzOgptb3JlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzgKICAgIC8vIHJldHVybiBNb3JlKGZvbz1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICsgMSksIGJhcj1hcmM0LlVJbnQ2NChzZWxmLmNvdW50ICogc2VsZi5jb3VudCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnQgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICAqCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxNiAxNDQKICAgIGJ5dGVjYmxvY2sgMHggMHgxNTFmN2M3NSAiY291bnQiIDB4MDAgMHgwMDAwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM5CiAgICAvLyBzZWxmLmNvdW50ID0gVUludDY0KDApCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjM3CiAgICAvLyBjbGFzcyBTdGF0aWNTaXplQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDI4ZDdjMWI4IDB4ZmE5Y2I5NzMgMHg2MDM5YTI0MCAweGY4ZmQ2OGE3IDB4MWYwMjhkYjEgMHgwOTZiM2E1OSAweDhkNmUzYTI1IC8vIG1ldGhvZCAidGVzdF9hcnJheSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2V4dGVuZF9mcm9tX3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9leHRlbmRfZnJvbV9hcmM0X3R1cGxlKCgodWludDY0LHVpbnQ2NCksKHVpbnQ2NCx1aW50NjQpKSkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAidGVzdF9ib29sX2FycmF5KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfYXJjNF9jb252ZXJzaW9uKHVpbnQ2NCl1aW50NjRbXSIsIG1ldGhvZCAic3VtX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9hcmM0X2Jvb2woKWJvb2xbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHRlc3RfYXJyYXkgdGVzdF9leHRlbmRfZnJvbV90dXBsZSB0ZXN0X2V4dGVuZF9mcm9tX2FyYzRfdHVwbGUgdGVzdF9ib29sX2FycmF5IHRlc3RfYXJjNF9jb252ZXJzaW9uIHN1bV9hcnJheSB0ZXN0X2FyYzRfYm9vbAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9iaXRzKGFycmF5OiBieXRlcywgbmV3X2l0ZW1zX2J5dGVzOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIHJlYWRfc3RlcDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYml0czoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtNAogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgY292ZXIgMgogICAgc3dhcAogICAgcHVzaGludCA3CiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgLwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNAoKZHluYW1pY19hcnJheV9jb25jYXRfYml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDE2CiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBmcmFtZV9idXJ5IDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfd2hpbGVfdG9wQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHNfYWZ0ZXJfd2hpbGVANQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBnZXRiaXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX3doaWxlX3RvcEAzCgpkeW5hbWljX2FycmF5X2NvbmNhdF9iaXRzX2FmdGVyX3doaWxlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC50ZXN0X2FycmF5W3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcnJheToKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDMKICAgIC8vIHNlbGYuY291bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ2CiAgICAvLyBQb2ludCh4PWFyYzQuVUludDY0KCksIHk9VUludDY0KCksIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIGNhbGxzdWIgeHRyYQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0NwogICAgLy8gUG9pbnQoeD14MSwgeT15MSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgY2FsbHN1YiB4dHJhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjQ4CiAgICAvLyBQb2ludCh4PXgyLCB5PXkyLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICBjYWxsc3ViIHh0cmEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NDQtNTAKICAgIC8vIHBhdGggPSBSZWZlcmVuY2VBcnJheSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIFBvaW50KHg9YXJjNC5VSW50NjQoKSwgeT1VSW50NjQoKSwgb3RoZXI9c2VsZi54dHJhKCkpLAogICAgLy8gICAgICAgICBQb2ludCh4PXgxLCB5PXkxLCBvdGhlcj1zZWxmLnh0cmEoKSksCiAgICAvLyAgICAgICAgIFBvaW50KHg9eDIsIHk9eTIsIG90aGVyPXNlbGYueHRyYSgpKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBkaWcgMTEKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCA2NAogICAgYnplcm8KICAgIHVuY292ZXIgMTIKICAgIGRpZyAxCiAgICBifAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA5CiAgICBkaWcgNAogICAgYnwKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGJ8CiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcnJheV9mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjUxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMyk6CiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYnogdGVzdF9hcnJheV9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MgogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuYiA9PSBpICsgMQogICAgZHVwMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjIDQgLy8gMTQ0CiAgICAqCiAgICBpbnRjIDQgLy8gMTQ0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMTYgMTI4CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1MwogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5mb28gPT0gaSArIDIKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggMTYKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyCiAgICArCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NAogICAgLy8gYXNzZXJ0IHBhdGhbaV0ub3RoZXIuZC5iYXIgPT0gKGkgKyAxKSAqIChpICsgMSkKICAgIGV4dHJhY3QgOCA4CiAgICBkaWcgMQogICAgZGlnIDIKICAgICoKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0CiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcnJheV9mb3JfaGVhZGVyQDIKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo1NgogICAgLy8gQm94KEltbXV0YWJsZUFycmF5W1BvaW50XSwga2V5PSJhIikudmFsdWUgPSBwYXRoLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50YyA0IC8vIDE0NAogICAgLwogICAgZHVwCiAgICBidXJ5IDEwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICJhIgogICAgYm94X2RlbAogICAgcG9wCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGV4dHJhY3QgMCAxNDQgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMTAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3MAogICAgLy8gbGVuZ3RoID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcxCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAzCgp0ZXN0X2FycmF5X2Zvcl9oZWFkZXJANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTcxCiAgICAvLyBmb3IgcG9pbnRfaWR4IGluIHVyYW5nZSgxLCBwYXRoLmxlbmd0aCk6CiAgICBkaWcgMgogICAgZGlnIDgKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1CiAgICBkaWcgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBkaWcgMwogICAgaW50YyA0IC8vIDE0NAogICAgKgogICAgaW50YyA0IC8vIDE0NAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXBuIDIKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzMKICAgIC8vIGlmIHBvaW50LnggPCBsYXN0X3BvaW50Lng6CiAgICBkaWcgMTAKICAgIGI8CiAgICBieiB0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzQKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZGlnIDEwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2OQogICAgLy8gbGFzdF9wb2ludCA9IHBhdGhbMF0KICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3NAogICAgLy8gZHggPSBsYXN0X3BvaW50LnguYXNfdWludDY0KCkgLSBwb2ludC54LmFzX3VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzQKICAgIC8vIGR4ID0gbGFzdF9wb2ludC54LmFzX3VpbnQ2NCgpIC0gcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwoKdGVzdF9hcnJheV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzcKICAgIC8vIGlmIHBvaW50LnkgPCBsYXN0X3BvaW50Lnk6CiAgICBkaWcgMwogICAgZGlnIDYKICAgIDwKICAgIGJ6IHRlc3RfYXJyYXlfZWxzZV9ib2R5QDEzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE3OAogICAgLy8gZHkgPSBsYXN0X3BvaW50LnkgLSBwb2ludC55CiAgICBkaWcgNQogICAgZGlnIDQKICAgIC0KCnRlc3RfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTgxCiAgICAvLyBsZW5ndGggKz0gb3Auc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKICAgIGRpZyA3CiAgICBkdXAKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgKgogICAgKwogICAgc3FydAogICAgZGlnIDUKICAgICsKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzEKICAgIC8vIGZvciBwb2ludF9pZHggaW4gdXJhbmdlKDEsIHBhdGgubGVuZ3RoKToKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHRlc3RfYXJyYXlfZm9yX2hlYWRlckA3Cgp0ZXN0X2FycmF5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTgwCiAgICAvLyBkeSA9IHBvaW50LnkgLSBsYXN0X3BvaW50LnkKICAgIGRpZyAzCiAgICBkaWcgNgogICAgLQogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTQKCnRlc3RfYXJyYXlfZWxzZV9ib2R5QDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzIKICAgIC8vIHBvaW50ID0gcGF0aFtwb2ludF9pZHhdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzYKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjkKICAgIC8vIGxhc3RfcG9pbnQgPSBwYXRoWzBdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNzYKICAgIC8vIGR4ID0gcG9pbnQueC5hc191aW50NjQoKSAtIGxhc3RfcG9pbnQueC5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIGJ1cnkgNwogICAgYiB0ZXN0X2FycmF5X2FmdGVyX2lmX2Vsc2VAMTEKCnRlc3RfYXJyYXlfYWZ0ZXJfZm9yQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA0CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9leHRlbmRfZnJvbV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMTYgMTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjIKICAgIC8vIGFyci5leHRlbmQoc29tZV9tb3JlKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2MwogICAgLy8gbGFzdCA9IGFyclstMV0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMTYKICAgIC8KICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAxNgogICAgKgogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMyAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY0CiAgICAvLyBhc3NlcnQgbGFzdCA9PSBzb21lX21vcmVbMV0KICAgIGR1cAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY1CiAgICAvLyByZXN1bHQgPSBhcnIuZnJlZXplKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo2NgogICAgLy8gYXNzZXJ0IHJlc3VsdFstMV0gPT0gbGFzdAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfZXh0ZW5kX2Zyb21fYXJjNF90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojc1CiAgICAvLyByZXR1cm4gYXJyLmZyZWV6ZSgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDE2CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYm9vbF9hcnJheVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm9vbF9hcnJheToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3OQogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYm9vbF0oKQogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGludGNfMSAvLyAxCgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2ZvckA1CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjgzCiAgICAvLyBhcnIuYXBwZW5kKGkgJSAyID09IDApCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMgogICAgJQogICAgIQogICAgZGlnIDQKICAgIHN3YXAKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4MgogICAgLy8gZm9yIGkgaW4gdXJhbmdlKDEsIGxlbmd0aCArIDEpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckAyCgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDU6CiAgICBkaWcgMgogICAgZHVwbiAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5Ojg0CiAgICAvLyBhc3NlcnQgYXJyLmxlbmd0aCA9PSBsZW5ndGgsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6ODcKICAgIC8vIGFycjIuZXh0ZW5kKGFycikKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo4OAogICAgLy8gYXNzZXJ0IGFycjIubGVuZ3RoID09IGxlbmd0aCAqIDIsICJleHBlY3RlZCBjb3JyZWN0IGxlbmd0aCIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDIKICAgICoKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6OTAKICAgIC8vIGNvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjkxCiAgICAvLyBmb3IgdmFsIGluIGFycjoKICAgIGxlbgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1Cgp0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MQogICAgLy8gZm9yIHZhbCBpbiBhcnI6CiAgICBkaWcgNAogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRlc3RfYm9vbF9hcnJheV9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MgogICAgLy8gaWYgdmFsOgogICAgYnogdGVzdF9ib29sX2FycmF5X2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5MwogICAgLy8gY291bnQgKz0gMQogICAgZGlnIDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDYKCnRlc3RfYm9vbF9hcnJheV9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2Jvb2xfYXJyYXlfZm9yX2hlYWRlckA2Cgp0ZXN0X2Jvb2xfYXJyYXlfYWZ0ZXJfZm9yQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyA1CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QudGVzdF9hcmM0X2NvbnZlcnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY29udmVyc2lvbjoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5OAogICAgLy8gYXJyID0gUmVmZXJlbmNlQXJyYXlbYXJjNC5VSW50NjRdKCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18xIC8vIDEKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTAxCiAgICAvLyBmb3IgaSBpbiB1cmFuZ2UoMSwgbGVuZ3RoICsgMSk6CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDIKICAgIC8vIGFyci5hcHBlbmQoYXJjNC5VSW50NjQoaSkpCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDEKICAgIC8vIGZvciBpIGluIHVyYW5nZSgxLCBsZW5ndGggKyAxKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckAyCgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JANToKICAgIGRpZyAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEwMwogICAgLy8gYXNzZXJ0IGFyci5sZW5ndGggPT0gbGVuZ3RoLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBkdXAKICAgIGJ1cnkgOAogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA0CiAgICAvLyBjb3VudCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQoKdGVzdF9hcmM0X2NvbnZlcnNpb25fZm9yX2hlYWRlckA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDUKICAgIC8vIGZvciB2YWwgaW4gYXJyOgogICAgZGlnIDQKICAgIGRpZyA3CiAgICA8CiAgICBieiB0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9mb3JAMTEKICAgIGRpZyAyCiAgICBkaWcgNQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA2CiAgICAvLyBpZiB2YWw6CiAgICBieXRlY18wIC8vIDB4CiAgICBiIT0KICAgIGJ6IHRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMDcKICAgIC8vIGNvdW50ICs9IDEKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA2Cgp0ZXN0X2FyYzRfY29udmVyc2lvbl9hZnRlcl9pZl9lbHNlQDk6CiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiB0ZXN0X2FyYzRfY29udmVyc2lvbl9mb3JfaGVhZGVyQDYKCnRlc3RfYXJjNF9jb252ZXJzaW9uX2FmdGVyX2ZvckAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTA5CiAgICAvLyBhcmM0X2FyciA9IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDY0XSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgZGlnIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTEwCiAgICAvLyBhcmM0X2Fyci5leHRlbmQoYXJyKQogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJyYXlzLnN0YXRpY19zaXplLlN0YXRpY1NpemVDb250cmFjdC5zdW1fYXJyYXlbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYXJyYXk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTE3CiAgICAvLyBhcnIuZXh0ZW5kKGFyYzRfYXJyKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTkKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIC8KICAgIGludGNfMCAvLyAwCgpzdW1fYXJyYXlfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjAKICAgIC8vIGZvciBpdGVtIGluIGFycjoKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IHN1bV9hcnJheV9hZnRlcl9mb3JANQogICAgZGlnIDMKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyMQogICAgLy8gdG90YWwgKz0gaXRlbS5hc191aW50NjQoKQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICArCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgc3VtX2FycmF5X2Zvcl9oZWFkZXJAMgoKc3VtX2FycmF5X2FmdGVyX2ZvckA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0LnRlc3RfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0MwogICAgLy8gYXJyLmFwcGVuZChhcmM0LkJvb2woVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpKQogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ0CiAgICAvLyBhcnIuYXBwZW5kKGFyYzQuQm9vbChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlcikpCiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgICE9CiAgICBieXRlY18zIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkdXBuIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ3CiAgICAvLyBkeW5fYXJyLmV4dGVuZChhcnIpCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTQ2CiAgICAvLyBkeW5fYXJyID0gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5Cb29sXSgpCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDcKICAgIC8vIGR5bl9hcnIuZXh0ZW5kKGFycikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2JpdHMKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDgKICAgIC8vIGFzc2VydCBkeW5fYXJyLmxlbmd0aCA9PSAyLCAiZXhwZWN0ZWQgY29ycmVjdCBsZW5ndGgiCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE0OQogICAgLy8gYXNzZXJ0IGR5bl9hcnIuYnl0ZXMubGVuZ3RoID09IDMsICJleHBlY3RlZCAzIGJ5dGVzIgogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIDMgYnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTUwCiAgICAvLyBhc3NlcnQgZHluX2FyclswXSA9PSAoVHhuLnNlbmRlciA9PSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwIgogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMTYKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgPT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE1MQogICAgLy8gYXNzZXJ0IGR5bl9hcnJbMV0gPT0gKFR4bi5zZW5kZXIgIT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMSIKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTcKICAgIGdldGJpdAogICAgYnl0ZWNfMyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9hcmM0X2Jvb2xfZm9yX2hlYWRlckAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTQtMTU2CiAgICAvLyAjIG5vdGU6IG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5CiAgICAvLyAjIGFycjIuZXh0ZW5kKGR5bl9hcnJheSkKICAgIC8vIGZvciBiIGluIGR5bl9hcnI6CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiB0ZXN0X2FyYzRfYm9vbF9hZnRlcl9mb3JANQogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMTYKICAgICsKICAgIGRpZyA1CiAgICBzd2FwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBkaWcgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTcKICAgIC8vIGFycjIuYXBwZW5kKGIpCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiB0ZXN0X2FyYzRfYm9vbF9mb3JfaGVhZGVyQDIKCnRlc3RfYXJjNF9ib29sX2FmdGVyX2ZvckA1OgogICAgZGlnIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTU4CiAgICAvLyBhc3NlcnQgYXJyMi5sZW5ndGggPT0gNCwgImV4cGVjdGVkIGNvcnJlY3QgbGVuZ3RoIgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGxlbmd0aAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNTkKICAgIC8vIGFzc2VydCBhcnIyWzBdID09IChUeG4uc2VuZGVyID09IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAiCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuIFNlbmRlcgogICAgdHhuIFJlY2VpdmVyCiAgICA9PQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTYwCiAgICAvLyBhc3NlcnQgYXJyMlsxXSA9PSAoVHhuLnNlbmRlciAhPSBUeG4ucmVjZWl2ZXIpLCAiZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxIgogICAgZHVwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjE2MQogICAgLy8gYXNzZXJ0IGFycjJbMl0gPT0gKFR4bi5zZW5kZXIgPT0gVHhuLnJlY2VpdmVyKSwgImV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMiIKICAgIGR1cAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICB0eG4gU2VuZGVyCiAgICB0eG4gUmVjZWl2ZXIKICAgID09CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgdmFsdWUgYXQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjIKICAgIC8vIGFzc2VydCBhcnIyWzNdID09IChUeG4uc2VuZGVyICE9IFR4bi5yZWNlaXZlciksICJleHBlY3RlZCBjb3JyZWN0IHZhbHVlIGF0IDMiCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4biBTZW5kZXIKICAgIHR4biBSZWNlaXZlcgogICAgIT0KICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCB2YWx1ZSBhdCAzCiAgICBkaWcgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNjQKICAgIC8vIHJldHVybiBhcnIuZnJlZXplKCkKICAgIGR1cAogICAgbGVuCiAgICBieXRlYyA0IC8vIDB4MDAwMAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYml0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFycmF5cy5zdGF0aWNfc2l6ZS5TdGF0aWNTaXplQ29udHJhY3QueHRyYSgpIC0+IHVpbnQ2NCwgdWludDY0LCBieXRlcywgYnl0ZXMsIGJ5dGVzOgp4dHJhOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMjcKICAgIC8vIHNlbGYuY291bnQgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEyOQogICAgLy8gYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTMxCiAgICAvLyBjPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJyYXlzL3N0YXRpY19zaXplLnB5OjEzMgogICAgLy8gZD1zZWxmLm1vcmUoKSwKICAgIGNhbGxzdWIgbW9yZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FycmF5cy9zdGF0aWNfc2l6ZS5weToxMzMKICAgIC8vIGU9QmlnVUludChzZWxmLmNvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTI4LTEzNAogICAgLy8gcmV0dXJuIFh0cmEoCiAgICAvLyAgICAgYT1UeG4ubnVtX2FwcF9hcmdzLAogICAgLy8gICAgIGI9c2VsZi5jb3VudCwKICAgIC8vICAgICBjPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgZD1zZWxmLm1vcmUoKSwKICAgIC8vICAgICBlPUJpZ1VJbnQoc2VsZi5jb3VudCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcnJheXMuc3RhdGljX3NpemUuU3RhdGljU2l6ZUNvbnRyYWN0Lm1vcmUoKSAtPiBieXRlczoKbW9yZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcnJheXMvc3RhdGljX3NpemUucHk6MTM4CiAgICAvLyByZXR1cm4gTW9yZShmb289YXJjNC5VSW50NjQoc2VsZi5jb3VudCArIDEpLCBiYXI9YXJjNC5VSW50NjQoc2VsZi5jb3VudCAqIHNlbGYuY291bnQpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgKgogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIMB+wI+AlMCygM8A28AMRkUMRgUEEQjQ4oEAShHAov8IllHAov+CEkWVwYAi/xMXABOAkyBBwgkCklPAoEHCCQKSU4CDEEADIsGiwUJr4sETFCMBCKMAIsDJQhJjAKL/giMAYsCiwEMQQAgi/2LAElOAlOLBIsCSU4DTwJUjAQjCIwCi/8IjABC/9iLBIwAiSJJKEcFNhoBNhoCFzYaAzYaBBcqImeIA6GIA56IA5tPDhZPDhZQTw1QTwxQSwsVgUAORIFAr08MSwGrTwJMUIAQAAAAAAAAAAAAAAAAAAAAAExQTw4WTw9MUE8MFk8MFlBPC1BPClBLCRWBQA5ETwlLBKtQUFBPBxZPCExQTwcWTwcWUE8GUE8FUEsEFYFADkRPBE8Eq1BQUCJJgQMMQQA5SklOAiEECyEEWFcQgEkkW0sCIwhMSwESRExXMBBJVwAITwOBAggWqERXCAhLAUsCCxaoREUBQv/ASwFJFSEECklFChZXBgJLAVCAAWG8SIABYUy/VwCQSUULSVcACEUKJFtFBiJFBSNFA0sCSwgMQQBcSwFLAyEECyEEWEcCVwAITCRbRQZLCqRBADZLCiJbTCJbCUUHSwNLBgxBABxLBUsECUsHSQtMSQsIkksFCEUFSwIjCEUDQv+wSwNLBglC/+EiW0sKIlsJRQdC/8hLBBYpTFCwI0M2GgFJVwAQTFcQEExLAVBJFSUKSSMJJQtLAkwlWElPBBJETBZXBgJPAlBJIlkjCUsBVwIATCULJVhPAhJEKUxQsCNDNhoBSUhJFSUKFlcGAkxQKUxQsCNDKEcCNhoBF0koTCMII0lLAgxBABhHAoECGBRLBEwrIk8CVFBFBCMIRQFC/+FLAkcCFUsGSU4EEkRLAVAVTwKBAgsSRCJFBxVFByJFBUsESwcMQQAaSwJLBSNYIlNBAAZLBSMIRQZLBCMIRQVC/95LBRYpTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAEEcCFksETFBFBCMIRQFC/+lLAhUkCklFCEsEEkQiRQYiRQVLBEsHDEEAHEsCSwUkCyRYKKlBAAZLBSMIRQZLBCMIRQVC/9wnBEsDUElXAgAVJAoWVwYCXAApTFCwI0M2GgFXAgBJIkwVJAoiSUsCDEEAFksDSwFJTgIkC1tLBAhFBCMIRQFC/+NLAhYpTFCwI0MxADEHEisiTwJUMQAxBxMrIk8CVFBHAhUnBEsCTwIkiPx6SU4CSSJZSU4DSYECEkRLARWBAxJESURLASVTKyJPAlQiUzEAMQcSEkQjDUSBEVMrIk8CVCJTMQAxBxMSRCJJSwMMQQAaRwIlCEsFTFMrIk8CVEsDTFBFAyMIRQFC/99LAUkVgQQSRElXAAEiUzEAMQcSEkRJVwEBIlMxADEHExJESVcCASJTMQAxBxISRFcDASJTMQAxBxMSREsESRUnBE4CJIj71ClMULAjQyIqZUQjCCpLAWcxGzEAiAAKIiplRBZPA04EiSIqZURJIwgWSwFPAgsWUIk=", + "approval": "CyAFAAEIEJABJgUABBUffHUFY291bnQBAAIAADEYQAADKiJnMRtBAEAxGRREMRhEggcEKNfBuAT6nLlzBGA5okAE+P1opwQfAo2xBAlrOlkEjW46JTYaAI4HAIEB+QI8Ak8CxgM4A2sAMRkUMRgUEEOKBAEoRwKL/CJZRwKL/ghJFlcGAIv8TFwATgJMgQcIJApJTwKBBwgkCklOAgxBAAyLBosFCa+LBExQjAQijACLAyUISYwCi/4IjAGLAosBDEEAIIv9iwBJTgJTiwSLAklOA08CVIwEIwiMAov/CIwAQv/YiwSMAIkiSShHBTYaATYaAhc2GgM2GgQXKiJniAOfiAOciAOZTw4WTw4WUE8NUE8MUEsLFYFADkSBQK9PDEsBq08CTFCAEAAAAAAAAAAAAAAAAAAAAABMUE8OFk8PTFBPDBZPDBZQTwtQTwpQSwkVgUAORE8JSwSrUFBQTwcWTwhMUE8HFk8HFlBPBlBPBVBLBBWBQA5ETwRPBKtQUFAiSYEDDEEAOUpJTgIhBAshBFhXEIBJJFtLAiMITEsBEkRMVzAQSVcACE8DgQIIFqhEVwgISwFLAgsWqERFAUL/wEsBSRUhBApJRQoWVwYCSwFQgAFhvEiAAWFMv1cAkElFC0lXAAhFCiRbRQYiRQUjRQNLAksIDEEAXEsBSwMhBAshBFhHAlcACEwkW0UGSwqkQQA2SwoiW0wiWwlFB0sDSwYMQQAcSwVLBAlLB0kLTEkLCJJLBQhFBUsCIwhFA0L/sEsDSwYJQv/hIltLCiJbCUUHQv/ISwQWKUxQsCNDNhoBSVcAEExXEBBMSwFQSRUlCkkjCSULSwJMJVhJTwQSREwWVwYCTwJQSSJZIwlLAVcCAEwlCyVYTwISRClMULAjQzYaAUkVJQoWVwYCTFApTFCwI0MoRwI2GgEXSShMIwgjSUsCDEEAGEcCgQIYFEsETCsiTwJUUEUEIwhFAUL/4UsCRwIVSwZJTgQSREsBUBVPAoECCxJEIkUHFUUHIkUFSwRLBwxBABpLAksFI1giU0EABksFIwhFBksEIwhFBUL/3ksFFilMULAjQyhHAjYaARdJKEwjCCNJSwIMQQAQRwIWSwRMUEUEIwhFAUL/6UsCFSQKSUUISwQSRCJFBiJFBUsESwcMQQAcSwJLBSQLJFgoqUEABksFIwhFBksEIwhFBUL/3CcESwNQSVcCABUkChZXBgJcAClMULAjQzYaAVcCAEkiTBUkCiJJSwIMQQAWSwNLAUlOAiQLW0sECEUEIwhFAUL/40sCFilMULAjQzEAMQcSKyJPAlQxADEHEysiTwJUUEcCFScESwJPAiSI/HxJTgJJIllJTgNJgQISREsBFYEDEkRJREsBJVMrIk8CVCJTMQAxBxISRCMNRIERUysiTwJUIlMxADEHExJEIklLAwxBABpHAiUISwVMUysiTwJUSwNMUEUDIwhFAUL/30sBSRWBBBJESVcAASJTMQAxBxISRElXAQEiUzEAMQcTEkRJVwIBIlMxADEHEhJEVwMBIlMxADEHExJESwRJFScETgIkiPvWKUxQsCNDIiplRCMIKksBZzEbMQCIAAoiKmVEFk8DTgSJIiplREkjCBZLAU8CCxZQiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/Arrays/data/StaticSizeContract.clear.teal b/tests/artifacts/Arrays/data/StaticSizeContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Arrays/data/StaticSizeContract.clear.teal +++ b/tests/artifacts/Arrays/data/StaticSizeContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/BoxContract/data/BoxContract.approval.teal b/tests/artifacts/BoxContract/data/BoxContract.approval.teal index eeb0a325..2dfc7294 100644 --- a/tests/artifacts/BoxContract/data/BoxContract.approval.teal +++ b/tests/artifacts/BoxContract/data/BoxContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@34 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xf26c6d42 0xef186cf7 0x7d37296e 0xf13dd937 0x33325d3d 0xa6174812 0xfabcb885 0xd566c632 0x04ef4971 0x23ecb32c 0x0199408d 0x772059ca 0x01263df6 0xeef75816 0x996497ae 0x6cec72ff 0x6f9d1075 0x59ef3760 0xaa666b96 0xdfbdd636 0xb532913a 0xc29f1669 0x9c888c09 0xe6f68506 0x8ee2c364 // method "store_enums()void", method "read_enums()(uint64,uint64)", method "set_boxes(uint64,byte[],string)void", method "boxes_exist()(bool,bool,bool,bool)", method "check_keys()void", method "read_boxes()(uint64,byte[],string,uint64)", method "indirect_extract_and_replace()void", method "delete_boxes()void", method "slice_box()void", method "arc4_box()void", method "create_many_ints()void", method "set_many_ints(uint64,uint64)void", method "sum_many_ints()uint64", method "test_box_ref()void", method "set_nested_struct((uint64,(uint64,uint64[][],uint64),(uint64,uint64[][],uint64)[],uint64))void", method "nested_write(uint64,uint64)void", method "nested_read(uint64,uint64,uint64)uint64", method "create_bools()void", method "set_bool(uint64,bool)void", method "sum_bools(uint64)uint64", method "box_map_test()void", method "box_map_set(uint64,string)void", method "box_map_get(uint64)string", method "box_map_del(uint64)void", method "box_map_exists(uint64)bool" @@ -23,7 +23,7 @@ main_create_bools_route@23: // tests/artifacts/BoxContract/contract.py:281 // self.too_many_bools.create() bytec 8 // "too_many_bools" - pushint 4125 // 4125 + pushint 4125 box_create pop // tests/artifacts/BoxContract/contract.py:279 @@ -35,7 +35,7 @@ main_create_many_ints_route@16: // tests/artifacts/BoxContract/contract.py:181 // self.many_ints.create() bytec 9 // "many_ints" - pushint 4104 // 4104 + pushint 4104 box_create pop // tests/artifacts/BoxContract/contract.py:179 @@ -47,7 +47,7 @@ main_arc4_box_route@15: // tests/artifacts/BoxContract/contract.py:171-172 // box_d = Box(StaticInts, key=Bytes(b"d")) // box_d.value = StaticInts(arc4.UInt8(0), arc4.UInt8(1), arc4.UInt8(2), arc4.UInt8(3)) - pushbytess 0x64 0x00010203 // 0x64, 0x00010203 + pushbytess 0x64 0x00010203 // tests/artifacts/BoxContract/contract.py:172 // box_d.value = StaticInts(arc4.UInt8(0), arc4.UInt8(1), arc4.UInt8(2), arc4.UInt8(3)) box_put @@ -68,8 +68,6 @@ main___algopy_default_create@34: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -178,12 +176,12 @@ set_boxes: // tests/artifacts/BoxContract/contract.py:91 // self.box_large.create() bytec_3 // "box_large" - pushint 6160 // 6160 + pushint 6160 box_create pop // tests/artifacts/BoxContract/contract.py:92 // self.box_large.value.e = UInt64(42) - pushint 42 // 42 + pushint 42 itob bytec_3 // "box_large" intc 4 // 4096 @@ -201,7 +199,7 @@ set_boxes: box_get assert // check self.box_a exists btoi - pushint 3 // 3 + pushint 3 + itob bytec 5 // "box_a" @@ -395,21 +393,21 @@ set_boxes: assert // tests/artifacts/BoxContract/contract.py:116 // assert self.box_d.value[:5] == b.native[:5] - pushint 5 // 5 + pushint 5 dig 2 < dig 2 - pushint 5 // 5 + pushint 5 uncover 2 select bytec 6 // "box_d" intc_2 // 0 uncover 2 box_extract - pushint 5 // 5 + pushint 5 dig 2 >= - pushint 5 // 5 + pushint 5 dig 3 uncover 2 select @@ -450,10 +448,12 @@ set_boxes: bytec_3 // "box_large" box_len pop - pushint 6160 // 6160 + pushint 6160 == + assert // tests/artifacts/BoxContract/contract.py:85 // @arc4.abimethod + intc_0 // 1 return @@ -488,7 +488,7 @@ boxes_exist: intc_1 // 2 uncover 2 setbit - pushint 3 // 3 + pushint 3 uncover 2 setbit bytec 4 // 0x151f7c75 @@ -548,7 +548,7 @@ read_boxes: concat dig 1 len - pushint 20 // 20 + pushint 20 + itob extract 6 2 @@ -624,11 +624,11 @@ delete_boxes: box_get swap btoi - pushint 42 // 42 + pushint 42 dig 1 dig 3 select - pushint 42 // 42 + pushint 42 == assert // tests/artifacts/BoxContract/contract.py:153 @@ -699,11 +699,11 @@ slice_box: intc_2 // 0 dig 2 select - pushint 7 // 7 + pushint 7 dig 2 < uncover 2 - pushint 7 // 7 + pushint 7 uncover 2 select dig 1 @@ -738,11 +738,11 @@ slice_box: intc_1 // 2 uncover 2 select - pushint 10 // 10 + pushint 10 dig 2 < uncover 2 - pushint 10 // 10 + pushint 10 uncover 2 select dig 1 @@ -752,8 +752,10 @@ slice_box: box_extract pushbytes 0x48656c6c6f == + assert // tests/artifacts/BoxContract/contract.py:160 // @arc4.abimethod + intc_0 // 1 return @@ -785,7 +787,7 @@ sum_many_ints: dup sum_many_ints_while_top@7: - pushint 10510 // 10510 + pushint 10510 global OpcodeBudget > bz sum_many_ints_after_while@12 @@ -821,7 +823,7 @@ sum_many_ints_for_header@2: // tests/artifacts/BoxContract/contract.py:191 // for val in self.many_ints.value: dig 1 - pushint 513 // 513 + pushint 513 < bz sum_many_ints_after_for@5 dig 1 @@ -874,7 +876,7 @@ test_box_ref: // tests/artifacts/BoxContract/contract.py:207-208 // # create // assert box_ref.create(size=UInt64(32)) - pushint 32 // 32 + pushint 32 box_create assert // tests/artifacts/BoxContract/contract.py:211-212 @@ -897,7 +899,7 @@ test_box_ref: bytec_2 // "blob" // tests/artifacts/BoxContract/contract.py:216 // box_ref.resize(8000) - pushint 8000 // 8000 + pushint 8000 box_resize // tests/artifacts/BoxContract/contract.py:204 // box_ref = Box(Bytes, key=String("blob")) @@ -913,7 +915,7 @@ test_box_ref: bytec_2 // "blob" // tests/artifacts/BoxContract/contract.py:218 // box_ref.replace(64, value_3) - pushint 64 // 64 + pushint 64 // tests/artifacts/BoxContract/contract.py:214 // value_3 = Bytes(b"hello") bytec 12 // 0x68656c6c6f @@ -926,7 +928,7 @@ test_box_ref: // tests/artifacts/BoxContract/contract.py:219 // prefix = box_ref.extract(0, 32 * 2 + value_3.length) intc_2 // 0 - pushint 69 // 69 + pushint 69 box_extract // tests/artifacts/BoxContract/contract.py:220 // assert prefix == app_address + sender_bytes + value_3 @@ -1004,14 +1006,14 @@ test_box_ref: pop // tests/artifacts/BoxContract/contract.py:235 // assert box_ref.length == 64 - pushint 64 // 64 + pushint 64 == assert // tests/artifacts/BoxContract/contract.py:238-239 // # instance box ref // self.box_ref.create(size=UInt64(32)) bytec 16 // "box_ref" - pushint 32 // 32 + pushint 32 box_create pop // tests/artifacts/BoxContract/contract.py:241 @@ -1112,7 +1114,7 @@ nested_write: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:261 // box.value.nested.b = value + 1 - pushint 4110 // 4110 + pushint 4110 uncover 2 box_replace // tests/artifacts/BoxContract/contract.py:262 @@ -1126,7 +1128,7 @@ nested_write: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:262 // box.value.nested.inner.arr_arr[index][index] = value + 2 - pushint 4136 // 4136 + pushint 4136 intc_1 // 2 box_extract btoi @@ -1181,7 +1183,7 @@ nested_write: // tests/artifacts/BoxContract/contract.py:263 // box.value.nested.inner.c = value + 3 dig 2 - pushint 3 // 3 + pushint 3 + itob // tests/artifacts/BoxContract/contract.py:259 @@ -1189,13 +1191,13 @@ nested_write: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:263 // box.value.nested.inner.c = value + 3 - pushint 4118 // 4118 + pushint 4118 uncover 2 box_replace // tests/artifacts/BoxContract/contract.py:264 // box.value.nested.inner.d = value + 4 dig 2 - pushint 4 // 4 + pushint 4 + itob // tests/artifacts/BoxContract/contract.py:259 @@ -1203,13 +1205,13 @@ nested_write: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:264 // box.value.nested.inner.d = value + 4 - pushint 4128 // 4128 + pushint 4128 uncover 2 box_replace // tests/artifacts/BoxContract/contract.py:265 // box.value.nested.woah[index].arr_arr[index][index] = value + 5 uncover 2 - pushint 5 // 5 + pushint 5 + itob // tests/artifacts/BoxContract/contract.py:259 @@ -1217,7 +1219,7 @@ nested_write: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:265 // box.value.nested.woah[index].arr_arr[index][index] = value + 5 - pushint 4108 // 4108 + pushint 4108 intc_1 // 2 box_extract btoi @@ -1250,7 +1252,7 @@ nested_write: box_extract btoi + - pushint 18 // 18 + pushint 18 + // tests/artifacts/BoxContract/contract.py:259 // box = Box(LargeNestedStruct, key="box") @@ -1333,7 +1335,7 @@ nested_read: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:271 // b = box.value.nested.b - pushint 4110 // 4110 + pushint 4110 intc_3 // 8 box_extract btoi @@ -1342,7 +1344,7 @@ nested_read: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:272 // arr_arr = box.value.nested.inner.arr_arr[i1][i2] - pushint 4136 // 4136 + pushint 4136 intc_1 // 2 box_extract btoi @@ -1398,7 +1400,7 @@ nested_read: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:273 // c = box.value.nested.inner.c - pushint 4118 // 4118 + pushint 4118 intc_3 // 8 box_extract btoi @@ -1407,7 +1409,7 @@ nested_read: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:274 // d = box.value.nested.inner.d - pushint 4128 // 4128 + pushint 4128 intc_3 // 8 box_extract btoi @@ -1416,7 +1418,7 @@ nested_read: bytec_0 // "box" // tests/artifacts/BoxContract/contract.py:275 // woah_arr_arr = box.value.nested.woah[i1].arr_arr[i2][i3] - pushint 4108 // 4108 + pushint 4108 intc_1 // 2 box_extract btoi @@ -1449,7 +1451,7 @@ nested_read: box_extract btoi + - pushint 18 // 18 + pushint 18 + // tests/artifacts/BoxContract/contract.py:269 // box = Box(LargeNestedStruct, key="box") @@ -1588,7 +1590,7 @@ sum_bools_for_header@2: // tests/artifacts/BoxContract/contract.py:290 // for value in self.too_many_bools.value: dup - pushint 33000 // 33000 + pushint 33000 < bz sum_bools_after_for@9 dupn 2 @@ -1661,7 +1663,7 @@ box_map_test: // assert self.box_map[key_0].bytes.length == value.bytes.length box_len pop - pushint 6 // 6 + pushint 6 == assert // tests/artifacts/BoxContract/contract.py:300 diff --git a/tests/artifacts/BoxContract/data/BoxContract.arc56.json b/tests/artifacts/BoxContract/data/BoxContract.arc56.json index da02a1eb..20e35e90 100644 --- a/tests/artifacts/BoxContract/data/BoxContract.arc56.json +++ b/tests/artifacts/BoxContract/data/BoxContract.arc56.json @@ -651,18 +651,6 @@ "sourceInfo": { "approval": { "sourceInfo": [ - { - "pc": [ - 133 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 359 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, { "pc": [ 842 @@ -671,7 +659,7 @@ }, { "pc": [ - 488 + 486 ], "errorMessage": "check self.box_a exists" }, @@ -683,71 +671,71 @@ }, { "pc": [ - 516, + 514, 857 ], "errorMessage": "check self.box_c exists" }, { "pc": [ - 1930 + 1932 ], "errorMessage": "check self.box_map entry exists" }, { "pc": [ - 1176 + 1178 ], "errorMessage": "check self.many_ints exists" }, { "pc": [ - 380 + 378 ], "errorMessage": "check self.oca exists" }, { "pc": [ - 1793 + 1795 ], "errorMessage": "check self.too_many_bools exists" }, { "pc": [ - 392 + 390 ], "errorMessage": "check self.txn exists" }, { "pc": [ - 1771 + 1773 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 1396, - 1423, - 1490, - 1515, - 1537, - 1585, - 1612, - 1658, - 1683, - 1708 + 1398, + 1425, + 1492, + 1517, + 1539, + 1587, + 1614, + 1660, + 1685, + 1710 ], "errorMessage": "index out of bounds" }, { "pc": [ - 1226 + 1228 ], "errorMessage": "no data" }, { "pc": [ - 1327 + 1329 ], "errorMessage": "struct.a is truthy" } @@ -760,19 +748,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYyNmM2ZDQyIDB4ZWYxODZjZjcgMHg3ZDM3Mjk2ZSAweGYxM2RkOTM3IDB4MzMzMjVkM2QgMHhhNjE3NDgxMiAweGZhYmNiODg1IDB4ZDU2NmM2MzIgMHgwNGVmNDk3MSAweDIzZWNiMzJjIDB4MDE5OTQwOGQgMHg3NzIwNTljYSAweDAxMjYzZGY2IDB4ZWVmNzU4MTYgMHg5OTY0OTdhZSAweDZjZWM3MmZmIDB4NmY5ZDEwNzUgMHg1OWVmMzc2MCAweGFhNjY2Yjk2IDB4ZGZiZGQ2MzYgMHhiNTMyOTEzYSAweGMyOWYxNjY5IDB4OWM4ODhjMDkgMHhlNmY2ODUwNiAweDhlZTJjMzY0IC8vIG1ldGhvZCAic3RvcmVfZW51bXMoKXZvaWQiLCBtZXRob2QgInJlYWRfZW51bXMoKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAic2V0X2JveGVzKHVpbnQ2NCxieXRlW10sc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveGVzX2V4aXN0KCkoYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgImNoZWNrX2tleXMoKXZvaWQiLCBtZXRob2QgInJlYWRfYm94ZXMoKSh1aW50NjQsYnl0ZVtdLHN0cmluZyx1aW50NjQpIiwgbWV0aG9kICJpbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlKCl2b2lkIiwgbWV0aG9kICJkZWxldGVfYm94ZXMoKXZvaWQiLCBtZXRob2QgInNsaWNlX2JveCgpdm9pZCIsIG1ldGhvZCAiYXJjNF9ib3goKXZvaWQiLCBtZXRob2QgImNyZWF0ZV9tYW55X2ludHMoKXZvaWQiLCBtZXRob2QgInNldF9tYW55X2ludHModWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdW1fbWFueV9pbnRzKCl1aW50NjQiLCBtZXRob2QgInRlc3RfYm94X3JlZigpdm9pZCIsIG1ldGhvZCAic2V0X25lc3RlZF9zdHJ1Y3QoKHVpbnQ2NCwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KSwodWludDY0LHVpbnQ2NFtdW10sdWludDY0KVtdLHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3dyaXRlKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAibmVzdGVkX3JlYWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJjcmVhdGVfYm9vbHMoKXZvaWQiLCBtZXRob2QgInNldF9ib29sKHVpbnQ2NCxib29sKXZvaWQiLCBtZXRob2QgInN1bV9ib29scyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc3RvcmVfZW51bXMgcmVhZF9lbnVtcyBzZXRfYm94ZXMgYm94ZXNfZXhpc3QgbWFpbl9jaGVja19rZXlzX3JvdXRlQDEwIHJlYWRfYm94ZXMgaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSBkZWxldGVfYm94ZXMgc2xpY2VfYm94IG1haW5fYXJjNF9ib3hfcm91dGVAMTUgbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2IHNldF9tYW55X2ludHMgc3VtX21hbnlfaW50cyB0ZXN0X2JveF9yZWYgc2V0X25lc3RlZF9zdHJ1Y3QgbmVzdGVkX3dyaXRlIG5lc3RlZF9yZWFkIG1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzIHNldF9ib29sIHN1bV9ib29scyBib3hfbWFwX3Rlc3QgYm94X21hcF9zZXQgYm94X21hcF9nZXQgYm94X21hcF9kZWwgYm94X21hcF9leGlzdHMKICAgIGVycgoKbWFpbl9jcmVhdGVfYm9vbHNfcm91dGVAMjM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgxCiAgICAvLyBzZWxmLnRvb19tYW55X2Jvb2xzLmNyZWF0ZSgpCiAgICBieXRlYyA4IC8vICJ0b29fbWFueV9ib29scyIKICAgIHB1c2hpbnQgNDEyNSAvLyA0MTI1CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfbWFueV9pbnRzX3JvdXRlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MQogICAgLy8gc2VsZi5tYW55X2ludHMuY3JlYXRlKCkKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHB1c2hpbnQgNDEwNCAvLyA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMgLy8gMHg2NCwgMHgwMDAxMDIwMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYm94X2QudmFsdWUgPSBTdGF0aWNJbnRzKGFyYzQuVUludDgoMCksIGFyYzQuVUludDgoMSksIGFyYzQuVUludDgoMiksIGFyYzQuVUludDgoMykpCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzNDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnN0b3JlX2VudW1zW3JvdXRpbmddKCkgLT4gdm9pZDoKc3RvcmVfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6NzUKICAgIC8vIHNlbGYub2NhLnZhbHVlID0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbgogICAgaW50Y18wIC8vIE9wdEluCiAgICBpdG9iCiAgICBieXRlYyAxMyAvLyAib2NhIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBzZWxmLnR4bi52YWx1ZSA9IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdG9iCiAgICBieXRlYyAxNCAvLyAidHhuIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2VudW1zW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVhZF9lbnVtczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IG9wLkJveC5nZXQoYiJvY2EiKVswXSA9PSBvcC5pdG9iKHNlbGYub2NhLnZhbHVlKQogICAgYnl0ZWMgMTMgLy8gMHg2ZjYzNjEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9jYSBleGlzdHMKICAgIGR1cAogICAgYnRvaQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IG9wLkJveC5nZXQoYiJ0eG4iKVswXSA9PSBvcC5pdG9iKHNlbGYudHhuLnZhbHVlKQogICAgYnl0ZWMgMTQgLy8gMHg3NDc4NmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR4biBleGlzdHMKICAgIGR1cAogICAgYnRvaQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4MwogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoKGFyYzQuVUludDY0KHNlbGYub2NhLnZhbHVlKSwgYXJjNC5VSW50NjQoc2VsZi50eG4udmFsdWUpKSkKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4OAogICAgLy8gc2VsZi5ib3hfYi52YWx1ZSA9IGIuY29weSgpCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA3IC8vICJiIgogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGMKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLmJveF9kLnZhbHVlID0gYi5uYXRpdmUKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5ib3hfbGFyZ2UuY3JlYXRlKCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIHB1c2hpbnQgNjE2MCAvLyA2MTYwCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSA9IFVJbnQ2NCg0MikKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTMKICAgIC8vIHNlbGYuYm94X2xhcmdlLnJlcGxhY2Uoc2l6ZV9vZihCeXRlczEwMjQpICogNCwgYXJjNC5VSW50NjQoNDIpLmJ5dGVzKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMmEKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDIKICAgIDwKICAgIGRpZyAyCiAgICBwdXNoaW50IDUgLy8gNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNSAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6IFVJbnQ2NCgyKV0gPT0gYi5uYXRpdmVbOiBVSW50NjQoMildCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDIKICAgID49CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbGFyZ2UubGVuZ3RoID09IHNpemVfb2YoTGFyZ2VTdHJ1Y3QpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIHB1c2hpbnQgNjE2MCAvLyA2MTYwCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hlc19leGlzdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveGVzX2V4aXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmV0dXJuIGJvb2woc2VsZi5ib3hfYSksIGJvb2woc2VsZi5ib3hfYiksIGJvb2woc2VsZi5ib3hfYyksIGJvb2woc2VsZi5ib3hfbGFyZ2UpCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9sZW4KICAgIGNvdmVyIDIKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIGNvdmVyIDMKICAgIHBvcAogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgY292ZXIgNAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBwdXNoaW50IDMgLy8gMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMCAvLyAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNyAvLyA3CiAgICBkaWcgMgogICAgPAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBjb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGJ5dGVzIDB4NTQ2NTczNzQ2OTZlNjcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjYKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1syOjEwXSA9PSBiIkhlbGxvIgogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBkaWcgMgogICAgPAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBjb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGJ5dGVzIDB4NDg2NTZjNmM2ZgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9tYW55X2ludHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfbWFueV9pbnRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYubWFueV9pbnRzLnZhbHVlW2luZGV4XSA9IHZhbHVlCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc3VtX21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1bV9tYW55X2ludHM6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAoKc3VtX21hbnlfaW50c193aGlsZV90b3BANzoKICAgIHB1c2hpbnQgMTA1MTAgLy8gMTA1MTAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfd2hpbGVAMTIKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAxNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIHN1bV9tYW55X2ludHNfd2hpbGVfdG9wQDcKCnN1bV9tYW55X2ludHNfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkwCiAgICAvLyB0b3RhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MQogICAgLy8gZm9yIHZhbCBpbiBzZWxmLm1hbnlfaW50cy52YWx1ZToKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFueV9pbnRzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKICAgIGJ1cnkgMgoKc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgZGlnIDEKICAgIHB1c2hpbnQgNTEzIC8vIDUxMwogICAgPAogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl9mb3JANQogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGJ5dGVjIDkgLy8gIm1hbnlfaW50cyIKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5MgogICAgLy8gdG90YWwgPSB0b3RhbCArIHZhbAogICAgZGlnIDIKICAgICsKICAgIGJ1cnkgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgYiBzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMgoKc3VtX21hbnlfaW50c19hZnRlcl9mb3JANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmW3JvdXRpbmddKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5Ny0xOTgKICAgIC8vICMgaW5pdCByZWYsIHdpdGggdmFsaWQga2V5IHR5cGVzCiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9ImJsb2IiKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTkKICAgIC8vIGFzc2VydCBub3QgYm94X3JlZiwgIm5vIGRhdGEiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBubyBkYXRhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNy0yMDgKICAgIC8vICMgY3JlYXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgcHVzaGludCAzMiAvLyAzMgogICAgYm94X2NyZWF0ZQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjExLTIxMgogICAgLy8gIyBtYW5pcHVsYXRlIGRhdGEKICAgIC8vIHNlbmRlcl9ieXRlcyA9IFR4bi5zZW5kZXIuYnl0ZXMKICAgIHR4biBTZW5kZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTMKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE1CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18yIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTYKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTcKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18yIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE4CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE0CiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyAxMiAvLyAweDY4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOQogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18yIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgZGlnIDEKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMAogICAgLy8gYXNzZXJ0IHByZWZpeCA9PSBhcHBfYWRkcmVzcyArIHNlbmRlcl9ieXRlcyArIHZhbHVlXzMKICAgIGNvbmNhdAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjItMjIzCiAgICAvLyAjIGRlbGV0ZQogICAgLy8gZGVsIGJveF9yZWYudmFsdWUKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjYtMjI3CiAgICAvLyAjIHF1ZXJ5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gYm94X3JlZi5tYXliZSgpCiAgICBib3hfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjI4CiAgICAvLyBhc3NlcnQgbm90IGV4aXN0cwogICAgZHVwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBiIiIKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzAKICAgIC8vIGFzc2VydCBib3hfcmVmLmdldChkZWZhdWx0PXNlbmRlcl9ieXRlcykgPT0gc2VuZGVyX2J5dGVzCiAgICBkaWcgMwogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzQKICAgIC8vIGFzc2VydCBib3hfcmVmLCAiQmxvYiBleGlzdHMiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzUKICAgIC8vIGFzc2VydCBib3hfcmVmLmxlbmd0aCA9PSA2NAogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vICMgaW5zdGFuY2UgYm94IHJlZgogICAgLy8gc2VsZi5ib3hfcmVmLmNyZWF0ZShzaXplPVVJbnQ2NCgzMikpCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MQogICAgLy8gZGVsIHNlbGYuYm94X3JlZi52YWx1ZQogICAgYnl0ZWMgMTYgLy8gImJveF9yZWYiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfbmVzdGVkX3N0cnVjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9uZXN0ZWRfc3RydWN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDYKICAgIC8vIGFzc2VydCBzdHJ1Y3QuYSwgInN0cnVjdC5hIGlzIHRydXRoeSIKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXNzZXJ0IC8vIHN0cnVjdC5hIGlzIHRydXRoeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NwogICAgLy8gc3RydWN0X2J5dGVzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDgKICAgIC8vIHN0cnVjdF9zaXplID0gc3RydWN0X2J5dGVzLmxlbmd0aAogICAgZHVwCiAgICBsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDkKICAgIC8vIHRhaWxfb2Zmc2V0ID0gVUludDY0KDQwOTYgKyAyKQogICAgaW50YyA1IC8vIDQwOTgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjUwLTI1MQogICAgLy8gIyBpbml0aWFsaXplIGJveCB0byB6ZXJvCiAgICAvLyBib3guY3JlYXRlKHNpemU9dGFpbF9vZmZzZXQgKyBzdHJ1Y3Rfc2l6ZSkKICAgIHN3YXAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjUyLTI1MwogICAgLy8gIyBzZXQgY29ycmVjdCBvZmZzZXQgZm9yIGR5bmFtaWMgcG9ydGlvbgogICAgLy8gYm94LnJlcGxhY2UodGFpbF9vZmZzZXQgLSAyLCBhcmM0LlVJbnQxNih0YWlsX29mZnNldCkuYnl0ZXMpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MTAwMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDUKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NC0yNTUKICAgIC8vICMgc2V0IGR5bmFtaWMgZGF0YQogICAgLy8gYm94LnJlcGxhY2UodGFpbF9vZmZzZXQsIHN0cnVjdF9ieXRlcykKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0Lm5lc3RlZF93cml0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm5lc3RlZF93cml0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MAogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5hID0gdmFsdWUKICAgIGludGMgNSAvLyA0MDk4CiAgICB1bmNvdmVyIDMKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5iID0gdmFsdWUgKyAxCiAgICBwdXNoaW50IDQxMTAgLy8gNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNiAvLyA0MTM2CiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAzCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgIGRpZyAzCiAgICAqCiAgICBpbnRjIDYgLy8gNDEzOAogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGRpZyA0CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjMKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYyA9IHZhbHVlICsgMwogICAgZGlnIDIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjMKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYyA9IHZhbHVlICsgMwogICAgcHVzaGludCA0MTE4IC8vIDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgcHVzaGludCA0MTI4IC8vIDQxMjgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDggLy8gNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICBkaWcgNAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICB1bmNvdmVyIDQKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5uZXN0ZWRfcmVhZFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm5lc3RlZF9yZWFkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MAogICAgLy8gYSA9IGJveC52YWx1ZS5uZXN0ZWQuYQogICAgaW50YyA1IC8vIDQwOTgKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcxCiAgICAvLyBiID0gYm94LnZhbHVlLm5lc3RlZC5iCiAgICBwdXNoaW50IDQxMTAgLy8gNDExMAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzIKICAgIC8vIGFycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLmlubmVyLmFycl9hcnJbaTFdW2kyXQogICAgcHVzaGludCA0MTM2IC8vIDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4IC8vIDQxMTgKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc0CiAgICAvLyBkID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5kCiAgICBwdXNoaW50IDQxMjggLy8gNDEyOAogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBwdXNoaW50IDQxMDggLy8gNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMCAvLyAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDAKICAgIC8vIGtleV8xID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDE3IC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTAKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBzZWxmLmJveF9tYXAubWF5YmUoa2V5XzEpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxMQogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxNwogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyAxMiAvLyAiaGVsbG8iCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzE5CiAgICAvLyBkZWwgdG1wX2JveF9tYXBba2V5XzFdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyMwogICAgLy8gc2VsZi5ib3hfbWFwW2tleV0gPSB2YWx1ZQogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2dldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZ2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI3CiAgICAvLyByZXR1cm4gc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZGVsW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzEKICAgIC8vIGRlbCBzZWxmLmJveF9tYXBba2V5XQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9leGlzdHNbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMzNQogICAgLy8gcmV0dXJuIGtleSBpbiBzZWxmLmJveF9tYXAKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDIgMCA4IDQwOTYgNDA5OCA0MTM4CiAgICBieXRlY2Jsb2NrICJib3giIDB4NDI0ZjU4NWY0MyAiYmxvYiIgImJveF9sYXJnZSIgMHgxNTFmN2M3NSAiYm94X2EiICJib3hfZCIgImIiICJ0b29fbWFueV9ib29scyIgIm1hbnlfaW50cyIgIjAiIDB4MDAwMjM0MzIgMHg2ODY1NmM2YzZmIDB4NmY2MzYxIDB4NzQ3ODZlIDB4MDY4MTAxICJib3hfcmVmIiAiZGVmYXVsdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo1OQogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhmMjZjNmQ0MiAweGVmMTg2Y2Y3IDB4N2QzNzI5NmUgMHhmMTNkZDkzNyAweDMzMzI1ZDNkIDB4YTYxNzQ4MTIgMHhmYWJjYjg4NSAweGQ1NjZjNjMyIDB4MDRlZjQ5NzEgMHgyM2VjYjMyYyAweDAxOTk0MDhkIDB4NzcyMDU5Y2EgMHgwMTI2M2RmNiAweGVlZjc1ODE2IDB4OTk2NDk3YWUgMHg2Y2VjNzJmZiAweDZmOWQxMDc1IDB4NTllZjM3NjAgMHhhYTY2NmI5NiAweGRmYmRkNjM2IDB4YjUzMjkxM2EgMHhjMjlmMTY2OSAweDljODg4YzA5IDB4ZTZmNjg1MDYgMHg4ZWUyYzM2NCAvLyBtZXRob2QgInN0b3JlX2VudW1zKCl2b2lkIiwgbWV0aG9kICJyZWFkX2VudW1zKCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInNldF9ib3hlcyh1aW50NjQsYnl0ZVtdLHN0cmluZyl2b2lkIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sLGJvb2wpIiwgbWV0aG9kICJjaGVja19rZXlzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcsdWludDY0KSIsIG1ldGhvZCAiaW5kaXJlY3RfZXh0cmFjdF9hbmRfcmVwbGFjZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJzbGljZV9ib3goKXZvaWQiLCBtZXRob2QgImFyYzRfYm94KCl2b2lkIiwgbWV0aG9kICJjcmVhdGVfbWFueV9pbnRzKCl2b2lkIiwgbWV0aG9kICJzZXRfbWFueV9pbnRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3VtX21hbnlfaW50cygpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2JveF9yZWYoKXZvaWQiLCBtZXRob2QgInNldF9uZXN0ZWRfc3RydWN0KCh1aW50NjQsKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NCksKHVpbnQ2NCx1aW50NjRbXVtdLHVpbnQ2NClbXSx1aW50NjQpKXZvaWQiLCBtZXRob2QgIm5lc3RlZF93cml0ZSh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm5lc3RlZF9yZWFkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY3JlYXRlX2Jvb2xzKCl2b2lkIiwgbWV0aG9kICJzZXRfYm9vbCh1aW50NjQsYm9vbCl2b2lkIiwgbWV0aG9kICJzdW1fYm9vbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYm94X21hcF90ZXN0KCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3NldCh1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJveF9tYXBfZ2V0KHVpbnQ2NClzdHJpbmciLCBtZXRob2QgImJveF9tYXBfZGVsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX2V4aXN0cyh1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHN0b3JlX2VudW1zIHJlYWRfZW51bXMgc2V0X2JveGVzIGJveGVzX2V4aXN0IG1haW5fY2hlY2tfa2V5c19yb3V0ZUAxMCByZWFkX2JveGVzIGluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2UgZGVsZXRlX2JveGVzIHNsaWNlX2JveCBtYWluX2FyYzRfYm94X3JvdXRlQDE1IG1haW5fY3JlYXRlX21hbnlfaW50c19yb3V0ZUAxNiBzZXRfbWFueV9pbnRzIHN1bV9tYW55X2ludHMgdGVzdF9ib3hfcmVmIHNldF9uZXN0ZWRfc3RydWN0IG5lc3RlZF93cml0ZSBuZXN0ZWRfcmVhZCBtYWluX2NyZWF0ZV9ib29sc19yb3V0ZUAyMyBzZXRfYm9vbCBzdW1fYm9vbHMgYm94X21hcF90ZXN0IGJveF9tYXBfc2V0IGJveF9tYXBfZ2V0IGJveF9tYXBfZGVsIGJveF9tYXBfZXhpc3RzCiAgICBlcnIKCm1haW5fY3JlYXRlX2Jvb2xzX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4MQogICAgLy8gc2VsZi50b29fbWFueV9ib29scy5jcmVhdGUoKQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBwdXNoaW50IDQxMjUKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9tYW55X2ludHNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLm1hbnlfaW50cy5jcmVhdGUoKQogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgcHVzaGludCA0MTA0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzRfYm94X3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE3MS0xNzIKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzcyAweDY0IDB4MDAwMTAyMDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNzIKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2NoZWNrX2tleXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdG9yZV9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnN0b3JlX2VudW1zOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLm9jYS52YWx1ZSA9IE9uQ29tcGxldGVBY3Rpb24uT3B0SW4KICAgIGludGNfMCAvLyBPcHRJbgogICAgaXRvYgogICAgYnl0ZWMgMTMgLy8gIm9jYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3NgogICAgLy8gc2VsZi50eG4udmFsdWUgPSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gInR4biIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9lbnVtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfZW51bXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODAKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIib2NhIilbMF0gPT0gb3AuaXRvYihzZWxmLm9jYS52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vIDB4NmY2MzYxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vY2EgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODEKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KGIidHhuIilbMF0gPT0gb3AuaXRvYihzZWxmLnR4bi52YWx1ZSkKICAgIGJ5dGVjIDE0IC8vIDB4NzQ3ODZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50eG4gZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODMKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKChhcmM0LlVJbnQ2NChzZWxmLm9jYS52YWx1ZSksIGFyYzQuVUludDY0KHNlbGYudHhuLnZhbHVlKSkpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSA9IGEKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAiYm94X2EiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuYm94X2IudmFsdWUgPSBiLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6ODkKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBjCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MAogICAgLy8gc2VsZi5ib3hfZC52YWx1ZSA9IGIubmF0aXZlCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyA2IC8vICJib3hfZCIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6OTEKICAgIC8vIHNlbGYuYm94X2xhcmdlLmNyZWF0ZSgpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBwdXNoaW50IDYxNjAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjkyCiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZS5lID0gVUludDY0KDQyKQogICAgcHVzaGludCA0MgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5MwogICAgLy8gc2VsZi5ib3hfbGFyZ2UucmVwbGFjZShzaXplX29mKEJ5dGVzMTAyNCkgKiA0LCBhcmM0LlVJbnQ2NCg0MikuYnl0ZXMpCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBpbnRjIDQgLy8gNDA5NgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo5OAogICAgLy8gc2VsZi5ib3hfYS52YWx1ZSArPSAzCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9hIGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCAzCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IubGVuZ3RoID09IGIuYnl0ZXMubGVuZ3RoCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gIyB0ZXN0IC52YWx1ZS5ieXRlcwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMF0gPT0gYy5ieXRlc1swXQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMiAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyA2CiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZGlnIDcKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBleHRyYWN0MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbOi0xXSA9PSBjLmJ5dGVzWzotMV0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgPAogICAgZGlnIDQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGRpZyA3CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGludGNfMSAvLyAyCiAgICBkaWcgNAogICAgPAogICAgdW5jb3ZlciA0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyA0CiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExMi0xMTMKICAgIC8vICMgdGVzdCAudmFsdWUgd2l0aCBCeXRlcyB0eXBlCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVswXSA9PSBiLm5hdGl2ZVswXQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMiAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVstMV0gPT0gYi5uYXRpdmVbLTFdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGJ5dGVjIDYgLy8gImJveF9kIgogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyA0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgZXh0cmFjdDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMTUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzotMV0gPT0gYi5uYXRpdmVbOi0xXQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMgogICAgc3dhcAogICAgLQogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDEKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6NV0gPT0gYi5uYXRpdmVbOjVdCiAgICBwdXNoaW50IDUKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgcHVzaGludCA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgcHVzaGludCA1CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgNiAvLyAiYm94X2QiCiAgICBpbnRjXzIgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18xIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2xhcmdlLmxlbmd0aCA9PSBzaXplX29mKExhcmdlU3RydWN0KQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgYm94X2xlbgogICAgcG9wCiAgICBwdXNoaW50IDYxNjAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94ZXNfZXhpc3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKSwgYm9vbChzZWxmLmJveF9sYXJnZSkKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieXRlYyA3IC8vICJiIgogICAgYm94X2xlbgogICAgY292ZXIgMgogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgY292ZXIgMwogICAgcG9wCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfbGVuCiAgICBjb3ZlciA0CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMwogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QucmVhZF9ib3hlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWRfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM1CiAgICAvLyBnZXRfYm94X3ZhbHVlX3BsdXNfMShzZWxmLmJveF9hKSAtIDEsCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozNDUKICAgIC8vIHJldHVybiBib3gudmFsdWUgKyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzUKICAgIC8vIGdldF9ib3hfdmFsdWVfcGx1c18xKHNlbGYuYm94X2EpIC0gMSwKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM2CiAgICAvLyBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwKICAgIGJ5dGVjIDcgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmJveF9jLnZhbHVlLAogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9jIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjEzOAogICAgLy8gc2VsZi5ib3hfbGFyZ2UudmFsdWUuZSwKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIGludGMgNCAvLyA0MDk2CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmluZGlyZWN0X2V4dHJhY3RfYW5kX3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgppbmRpcmVjdF9leHRyYWN0X2FuZF9yZXBsYWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gbGFyZ2UgPSBzZWxmLmJveF9sYXJnZS52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gImJveF9sYXJnZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyBsYXJnZSA9IHNlbGYuYm94X2xhcmdlLnZhbHVlLmNvcHkoKQogICAgLy8gbGFyZ2UuZSArPSAxCiAgICBpbnRjIDQgLy8gNDA5NgogICAgaW50Y18zIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ0CiAgICAvLyBsYXJnZS5lICs9IDEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmJveF9sYXJnZS52YWx1ZSA9IGxhcmdlLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiYm94X2xhcmdlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0My0xNDUKICAgIC8vIGxhcmdlID0gc2VsZi5ib3hfbGFyZ2UudmFsdWUuY29weSgpCiAgICAvLyBsYXJnZS5lICs9IDEKICAgIC8vIHNlbGYuYm94X2xhcmdlLnZhbHVlID0gbGFyZ2UuY29weSgpCiAgICBpbnRjIDQgLy8gNDA5NgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjIDUgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUwCiAgICAvLyBkZWwgc2VsZi5ib3hfYi52YWx1ZQogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1MQogICAgLy8gZGVsIHNlbGYuYm94X2MudmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlYyA1IC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIKICAgIGRpZyAxCiAgICBkaWcgMwogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTUzCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi5nZXQoZGVmYXVsdD1hcmM0LkR5bmFtaWNCeXRlcyhiIjQyIikpLm5hdGl2ZSA9PSBiIjQyIgogICAgYnl0ZWMgNyAvLyAiYiIKICAgIGJveF9nZXQKICAgIGJ5dGVjIDExIC8vIDB4MDAwMjM0MzIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLmdldChkZWZhdWx0PWFyYzQuU3RyaW5nKCI0MiIpKSA9PSAiNDIiCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2dldAogICAgYnl0ZWMgMTEgLy8gMHgwMDAyMzQzMgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMSAvLyAweDAwMDIzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTU2CiAgICAvLyBhc3NlcnQgbm90IGFfZXhpc3RzCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhID09IDAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE1OAogICAgLy8gZGVsIHNlbGYuYm94X2xhcmdlLnZhbHVlCiAgICBieXRlY18zIC8vICJib3hfbGFyZ2UiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zbGljZV9ib3hbcm91dGluZ10oKSAtPiB2b2lkOgpzbGljZV9ib3g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYzCiAgICAvLyBib3hfMC52YWx1ZSA9IEJ5dGVzKGIiVGVzdGluZyB0ZXN0aW5nIDEyMyIpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjMKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYyCiAgICAvLyBib3hfMCA9IEJveChCeXRlcywga2V5PVN0cmluZygiMCIpKQogICAgYnl0ZWMgMTAgLy8gIjAiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTY0CiAgICAvLyBhc3NlcnQgYm94XzAudmFsdWVbMDo3XSA9PSBiIlRlc3RpbmciCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgaW50Y18yIC8vIDAKICAgIGRpZyAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjIKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyAxMCAvLyAiMCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjQKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE2NgogICAgLy8gc2VsZi5ib3hfYy52YWx1ZSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgcHVzaGJ5dGVzIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxNjcKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzI6MTBdID09IGIiSGVsbG8iCiAgICBieXRlY18xIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTAKICAgIGRpZyAyCiAgICA8CiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMSAvLyAweDQyNGY1ODVmNDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg0ODY1NmM2YzZmCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3Quc2V0X21hbnlfaW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9tYW55X2ludHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5tYW55X2ludHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fbWFueV9pbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VtX21hbnlfaW50czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCgpzdW1fbWFueV9pbnRzX3doaWxlX3RvcEA3OgogICAgcHVzaGludCAxMDUxMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgc3VtX21hbnlfaW50c193aGlsZV90b3BANwoKc3VtX21hbnlfaW50c19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTAKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTkxCiAgICAvLyBmb3IgdmFsIGluIHNlbGYubWFueV9pbnRzLnZhbHVlOgogICAgYnl0ZWMgOSAvLyAibWFueV9pbnRzIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYW55X2ludHMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMAogICAgYnVyeSAyCgpzdW1fbWFueV9pbnRzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTEKICAgIC8vIGZvciB2YWwgaW4gc2VsZi5tYW55X2ludHMudmFsdWU6CiAgICBkaWcgMQogICAgcHVzaGludCA1MTMKICAgIDwKICAgIGJ6IHN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBieXRlYyA5IC8vICJtYW55X2ludHMiCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTIKICAgIC8vIHRvdGFsID0gdG90YWwgKyB2YWwKICAgIGRpZyAyCiAgICArCiAgICBidXJ5IDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKICAgIGIgc3VtX21hbnlfaW50c19mb3JfaGVhZGVyQDIKCnN1bV9tYW55X2ludHNfYWZ0ZXJfZm9yQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnRlc3RfYm94X3JlZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRlc3RfYm94X3JlZjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIGluaXQgcmVmLCB3aXRoIHZhbGlkIGtleSB0eXBlcwogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PSJibG9iIikKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MTk5CiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDctMjA4CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIHB1c2hpbnQgMzIKICAgIGJveF9jcmVhdGUKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxMS0yMTIKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjEzCiAgICAvLyBhcHBfYWRkcmVzcyA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNQogICAgLy8gYm94X3JlZi5yZXBsYWNlKDAsIHNlbmRlcl9ieXRlcykKICAgIGludGNfMiAvLyAwCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE2CiAgICAvLyBib3hfcmVmLnJlc2l6ZSg4MDAwKQogICAgcHVzaGludCA4MDAwCiAgICBib3hfcmVzaXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNwogICAgLy8gYm94X3JlZi5zcGxpY2UoMCwgMCwgYXBwX2FkZHJlc3MpCiAgICBpbnRjXzIgLy8gMAogICAgZHVwCiAgICBkaWcgMwogICAgYm94X3NwbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTgKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIHB1c2hpbnQgNjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMTQKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDEyIC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYm94X3JlZi5yZXBsYWNlKDY0LCB2YWx1ZV8zKQogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMDQKICAgIC8vIGJveF9yZWYgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzIgLy8gImJsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjE5CiAgICAvLyBwcmVmaXggPSBib3hfcmVmLmV4dHJhY3QoMCwgMzIgKiAyICsgdmFsdWVfMy5sZW5ndGgpCiAgICBpbnRjXzIgLy8gMAogICAgcHVzaGludCA2OQogICAgYm94X2V4dHJhY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIxNAogICAgLy8gdmFsdWVfMyA9IEJ5dGVzKGIiaGVsbG8iKQogICAgYnl0ZWMgMTIgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyMi0yMjMKICAgIC8vICMgZGVsZXRlCiAgICAvLyBkZWwgYm94X3JlZi52YWx1ZQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyNi0yMjcKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICBkdXAKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGIiIgogICAgZGlnIDEKICAgIHB1c2hieXRlcyAweAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMAogICAgLy8gYXNzZXJ0IGJveF9yZWYuZ2V0KGRlZmF1bHQ9c2VuZGVyX2J5dGVzKSA9PSBzZW5kZXJfYnl0ZXMKICAgIGRpZyAzCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjMyLTIzMwogICAgLy8gIyB1cGRhdGUKICAgIC8vIGJveF9yZWYudmFsdWUgPSBzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzMi0yMzMKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnZhbHVlID0gc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYm94X3JlZiA9IEJveChCeXRlcywga2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMiAvLyAiYmxvYiIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyMzItMjMzCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi52YWx1ZSA9IHNlbmRlcl9ieXRlcyArIGFwcF9hZGRyZXNzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjA0CiAgICAvLyBib3hfcmVmID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18yIC8vICJibG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNAogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBwdXNoaW50IDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gIyBpbnN0YW5jZSBib3ggcmVmCiAgICAvLyBzZWxmLmJveF9yZWYuY3JlYXRlKHNpemU9VUludDY0KDMyKSkKICAgIGJ5dGVjIDE2IC8vICJib3hfcmVmIgogICAgcHVzaGludCAzMgogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQxCiAgICAvLyBkZWwgc2VsZi5ib3hfcmVmLnZhbHVlCiAgICBieXRlYyAxNiAvLyAiYm94X3JlZiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjE5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9uZXN0ZWRfc3RydWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X25lc3RlZF9zdHJ1Y3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHN0cnVjdC5hLCAic3RydWN0LmEgaXMgdHJ1dGh5IgogICAgaW50Y18yIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gc3RydWN0LmEgaXMgdHJ1dGh5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ3CiAgICAvLyBzdHJ1Y3RfYnl0ZXMgPSBUeG4uYXBwbGljYXRpb25fYXJncygxKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc3RydWN0X3NpemUgPSBzdHJ1Y3RfYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGFpbF9vZmZzZXQgPSBVSW50NjQoNDA5NiArIDIpCiAgICBpbnRjIDUgLy8gNDA5OAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1MC0yNTEKICAgIC8vICMgaW5pdGlhbGl6ZSBib3ggdG8gemVybwogICAgLy8gYm94LmNyZWF0ZShzaXplPXRhaWxfb2Zmc2V0ICsgc3RydWN0X3NpemUpCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTAtMjUxCiAgICAvLyAjIGluaXRpYWxpemUgYm94IHRvIHplcm8KICAgIC8vIGJveC5jcmVhdGUoc2l6ZT10YWlsX29mZnNldCArIHN0cnVjdF9zaXplKQogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ1CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTItMjUzCiAgICAvLyAjIHNldCBjb3JyZWN0IG9mZnNldCBmb3IgZHluYW1pYyBwb3J0aW9uCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCAtIDIsIGFyYzQuVUludDE2KHRhaWxfb2Zmc2V0KS5ieXRlcykKICAgIGludGMgNCAvLyA0MDk2CiAgICBwdXNoYnl0ZXMgMHgxMDAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0NQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0YWlsX29mZnNldCA9IFVJbnQ2NCg0MDk2ICsgMikKICAgIGludGMgNSAvLyA0MDk4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU0LTI1NQogICAgLy8gIyBzZXQgZHluYW1pYyBkYXRhCiAgICAvLyBib3gucmVwbGFjZSh0YWlsX29mZnNldCwgc3RydWN0X2J5dGVzKQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3dyaXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKbmVzdGVkX3dyaXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYwCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmEgPSB2YWx1ZQogICAgaW50YyA1IC8vIDQwOTgKICAgIHVuY292ZXIgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjEKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuYiA9IHZhbHVlICsgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYxCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmIgPSB2YWx1ZSArIDEKICAgIHB1c2hpbnQgNDExMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MgogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDIKICAgIHB1c2hpbnQgNDEzNgogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICBkaWcgMwogICAgKgogICAgaW50YyA2IC8vIDQxMzgKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNiAvLyA0MTM4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNQogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjIKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGJveF9yZXBsYWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjYzCiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmMgPSB2YWx1ZSArIDMKICAgIGRpZyAyCiAgICBwdXNoaW50IDMKICAgICsKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2MwogICAgLy8gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5jID0gdmFsdWUgKyAzCiAgICBwdXNoaW50IDQxMTgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjQKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZCA9IHZhbHVlICsgNAogICAgZGlnIDIKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY0CiAgICAvLyBib3gudmFsdWUubmVzdGVkLmlubmVyLmQgPSB2YWx1ZSArIDQKICAgIHB1c2hpbnQgNDEyOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA1CiAgICArCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjU5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjUKICAgIC8vIGJveC52YWx1ZS5uZXN0ZWQud29haFtpbmRleF0uYXJyX2FycltpbmRleF1baW5kZXhdID0gdmFsdWUgKyA1CiAgICBwdXNoaW50IDQxMDgKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA1IC8vIDQwOTgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA1CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIGR1cAogICAgZGlnIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgcHVzaGludCAxOAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNTkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2NQogICAgLy8gYm94LnZhbHVlLm5lc3RlZC53b2FoW2luZGV4XS5hcnJfYXJyW2luZGV4XVtpbmRleF0gPSB2YWx1ZSArIDUKICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18xIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY1CiAgICAvLyBib3gudmFsdWUubmVzdGVkLndvYWhbaW5kZXhdLmFycl9hcnJbaW5kZXhdW2luZGV4XSA9IHZhbHVlICsgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QubmVzdGVkX3JlYWRbcm91dGluZ10oKSAtPiB2b2lkOgpuZXN0ZWRfcmVhZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzAKICAgIC8vIGEgPSBib3gudmFsdWUubmVzdGVkLmEKICAgIGludGMgNSAvLyA0MDk4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gYiA9IGJveC52YWx1ZS5uZXN0ZWQuYgogICAgcHVzaGludCA0MTEwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBwdXNoaW50IDQxMzYKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDUKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzEgLy8gMgogICAgZGlnIDUKICAgICoKICAgIGludGMgNiAvLyA0MTM4CiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjcyCiAgICAvLyBhcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC5pbm5lci5hcnJfYXJyW2kxXVtpMl0KICAgIHN3YXAKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA2IC8vIDQxMzgKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNgogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkaWcgNQogICAgaW50Y18zIC8vIDgKICAgICoKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYXJyX2FycltpMV1baTJdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3MwogICAgLy8gYyA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuYwogICAgcHVzaGludCA0MTE4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NAogICAgLy8gZCA9IGJveC52YWx1ZS5uZXN0ZWQuaW5uZXIuZAogICAgcHVzaGludCA0MTI4CiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjkKICAgIC8vIGJveCA9IEJveChMYXJnZU5lc3RlZFN0cnVjdCwga2V5PSJib3giKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI3NQogICAgLy8gd29haF9hcnJfYXJyID0gYm94LnZhbHVlLm5lc3RlZC53b2FoW2kxXS5hcnJfYXJyW2kyXVtpM10KICAgIHB1c2hpbnQgNDEwOAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDUgLy8gNDA5OAogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAxMAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICBwdXNoaW50IDE4CiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgOAogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICBpbnRjXzEgLy8gMgogICAgdW5jb3ZlciA4CiAgICAqCiAgICBkaWcgMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI2OQogICAgLy8gYm94ID0gQm94KExhcmdlTmVzdGVkU3RydWN0LCBrZXk9ImJveCIpCiAgICBieXRlY18wIC8vICJib3giCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjc1CiAgICAvLyB3b2FoX2Fycl9hcnIgPSBib3gudmFsdWUubmVzdGVkLndvYWhbaTFdLmFycl9hcnJbaTJdW2kzXQogICAgc3dhcAogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMSAvLyAyCiAgICArCiAgICB1bmNvdmVyIDYKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICArCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjY5CiAgICAvLyBib3ggPSBCb3goTGFyZ2VOZXN0ZWRTdHJ1Y3QsIGtleT0iYm94IikKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzUKICAgIC8vIHdvYWhfYXJyX2FyciA9IGJveC52YWx1ZS5uZXN0ZWQud29haFtpMV0uYXJyX2FycltpMl1baTNdCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNzcKICAgIC8vIHJldHVybiBhICsgYiArIGFycl9hcnIgKyBjICsgZCArIHdvYWhfYXJyX2FycgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgICsKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAzCiAgICArCiAgICB1bmNvdmVyIDIKICAgICsKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LnNldF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGludGNfMiAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODUKICAgIC8vIHNlbGYudG9vX21hbnlfYm9vbHMudmFsdWVbaW5kZXhdID0gdmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgLwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gInRvb19tYW55X2Jvb2xzIgogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5zdW1fYm9vbHNbcm91dGluZ10oKSAtPiB2b2lkOgpzdW1fYm9vbHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI4OQogICAgLy8gdG90YWwgPSBVSW50NjQoKQogICAgaW50Y18yIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTAKICAgIC8vIGZvciB2YWx1ZSBpbiBzZWxmLnRvb19tYW55X2Jvb2xzLnZhbHVlOgogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvb19tYW55X2Jvb2xzIGV4aXN0cwogICAgaW50Y18yIC8vIDAKCnN1bV9ib29sc19mb3JfaGVhZGVyQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkwCiAgICAvLyBmb3IgdmFsdWUgaW4gc2VsZi50b29fbWFueV9ib29scy52YWx1ZToKICAgIGR1cAogICAgcHVzaGludCAzMzAwMAogICAgPAogICAgYnogc3VtX2Jvb2xzX2FmdGVyX2ZvckA5CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyA4CiAgICAvCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgJQogICAgYnl0ZWMgOCAvLyAidG9vX21hbnlfYm9vbHMiCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MjkxCiAgICAvLyBpZiB2YWx1ZToKICAgIGJ6IHN1bV9ib29sc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weToyOTIKICAgIC8vIHRvdGFsICs9IDEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpzdW1fYm9vbHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gaWYgdG90YWwgPT0gc3RvcF9hdF90b3RhbDoKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPT0KICAgIGJueiBzdW1fYm9vbHNfYWZ0ZXJfZm9yQDkKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzdW1fYm9vbHNfZm9yX2hlYWRlckAyCgpzdW1fYm9vbHNfYWZ0ZXJfZm9yQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF90ZXN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF90ZXN0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjI5OQogICAgLy8ga2V5XzAgPSBVSW50NjQoMCkKICAgIGludGNfMiAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkdXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAyCiAgICAvLyBzZWxmLmJveF9tYXBba2V5XzBdID0gdmFsdWUKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXBba2V5XzBdLmJ5dGVzLmxlbmd0aCA9PSB2YWx1ZS5ieXRlcy5sZW5ndGgKICAgIGJveF9sZW4KICAgIHBvcAogICAgcHVzaGludCA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzAwCiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9tYXAuZ2V0KGtleV8xLCBkZWZhdWx0PVN0cmluZygiZGVmYXVsdCIpKSA9PSBTdHJpbmcoImRlZmF1bHQiKQogICAgaXRvYgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBieXRlYyAxNyAvLyAiZGVmYXVsdCIKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHQiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzEwCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gc2VsZi5ib3hfbWFwLm1heWJlKGtleV8xKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTEKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMTcKICAgIC8vIHRtcF9ib3hfbWFwW2tleV8xXSA9IFN0cmluZygiaGVsbG8iKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGR1cAogICAgYnl0ZWMgMTIgLy8gImhlbGxvIgogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9zZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjMKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQm94Q29udHJhY3QuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpib3hfbWFwX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBpdG9iCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfbWFwIGVudHJ5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5Cb3hDb250cmFjdC5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJveF9tYXBfZGVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMxCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGl0b2IKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0JveENvbnRyYWN0L2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkJveENvbnRyYWN0LmNvbnRyYWN0LkJveENvbnRyYWN0LmJveF9tYXBfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm94X21hcF9leGlzdHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQm94Q29udHJhY3QvY29udHJhY3QucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9Cb3hDb250cmFjdC9jb250cmFjdC5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMiAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKwA6AFoB2AAfAggCTgJfAqAAEwAKAxsDLQOGA+sEDQTPAAEFkQW4Bf8GMgZFBlsGZAAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBEIkMiFicNTL+BBhYnDky/IkMnDb5ESRcWTEsBEkQnDr5ESRcWTEsBEkRQJwRMULAiQzYaARc2GgI2GgNPAhYnBUy/Jwe8SCcHSwK/KbxIKUsBv0sBVwIAJwa8SCcGSwG/K4GQMLlIgSoWKyEETwK7KyEEgAgAAAAAAAAAKrsnBb5EF4EDCBYnBUy/JwW9SCUSRCcHvUhLAxUSRCm9REsCFUoSRCcGvUhLAxVKEkQpJCK6SwZXAAESREsDIgkpTCK6SwMiCUsHTCJYEkQiSwQMSwQiTwJNSwRMCSkkTwK6IksEDyJLBU8CTUsETAlLByRPAlISRCNLBAxPBCNPAk0pJE8CuiNLBA8jTwVPAk1PBSRPAlISRCcGJCK6TwRXAgESREsBIgknBkwiuksBIglLBEwiWBJEIksCDEsCIk8CTUsCTAknBiRPAroiSwIPIksDTwJNSwJMCUsEJE8CUhJEgQVLAgxLAoEFTwJNJwYkTwK6gQVLAg+BBUsDTwJNSwQkTwJSEkQjSwIMTwIjTwJNJwYkTwK6I0sCDyNPA08CTU8CJE8CUhJEK71IgZAwEkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SQzYaARc2GgJMJQsnCUxPArsiQ4AASYGOUjIMDUEAGLGBBrIQgQWyGScPsh4nD7IfJLIBs0L/3yRFAScJvUUBRCRFAksBgYEEDEEAF0sBSSULJwlMJboXSwIIRQIiCEUCQv/gSRYnBExQsCJDKr1FARREKoEguUQxADIKKiRLA7sqgcA+0yokSUsD0iqBQCcMuyokgUW6SwFLA1AnDFASRCq8SCq+SRRESwGAABJESwNOAk1LAhJEUCq8SCpMvyq9SIFAEkQnEIEguUgnELxIIkM2GgEkW0Q2GgFJFSEFCChMuUgoIQSAAhACuyghBU8CuyJDNhoBFzYaAkkXKCEFTwO7SSIIFiiBjiBPArtJIwgWKIGoICO6F0sDDUQjSwMLIQZLAQgoTCO6FyEGCChLASO6F0sFDUQjCEsEJQtMSwEIKExPBLtLAoEDCBYogZYgTwK7SwKBBAgWKIGgIE8Cu08CgQUIFiiBjCAjuhchBQgoSwEjuhdLBQ1EIwhJSwQIKEwjuhcIgRIIKEsBI7oXSwUNRCMISU8ECChMI7oXCChLASO6F08EDUQjCE8CCChMTwK7IkM2GgEXNhoCFzYaAxcoIQUluhcogY4gJboXKIGoICO6F0sFDUQjSwULIQZLAQgoTCO6FyEGCChLASO6F0sGDUQjCEsFJQsIKEwluhcogZYgJboXKIGgICW6FyiBjCAjuhchBQgoSwEjuhdPCg1EIwhJTwUIKEwjuhcIgRIIKEsBI7oXSwgNRCMII08IC0sBCChMI7oXCChLASO6F0sHDUQjCE8GJQsIKEwluhdPBU8FCE8ECE8DCE8CCAgWJwRMULAiQzYaARc2GgIkU0sBJQpPAiUYJwhLAiK6SwElDERMTwNUJwhOArsiQzYaARckJwi9RQFEJEmB6IECDEEAKEcCJQpMJRgnCE8CIrpMU0EABksBIghFAksBSwMSQAAISSIIRQFC/89LARYnBExQsCJDJBZJvEhJgAZIbW1tbW2/vUiBBhJEIhZJvicRTgJNJxESREm9RQEUREm8SEknDL+8SCJDNhoBFzYaAlcCAEwWSbxITL8iQzYaARcWvkRJFRZXBgJMUCcETFCwIkM2GgEXFrxIIkM2GgEXFr1FAYABACRPAlQnBExQsCJD", + "approval": "CyAHAQIACIAggiCqICYSA2JveAVCT1hfQwRibG9iCWJveF9sYXJnZQQVH3x1BWJveF9hBWJveF9kAWIOdG9vX21hbnlfYm9vbHMJbWFueV9pbnRzATAEAAI0MgVoZWxsbwNvY2EDdHhuAwaBAQdib3hfcmVmB2RlZmF1bHQxG0EA3jEZFEQxGESCGQTybG1CBO8YbPcEfTcpbgTxPdk3BDMyXT0EphdIEgT6vLiFBNVmxjIEBO9JcQQj7LMsBAGZQI0EdyBZygQBJj32BO73WBYEmWSXrgRs7HL/BG+dEHUEWe83YASqZmuWBN+91jYEtTKROgTCnxZpBJyIjAkE5vaFBgSO4sNkNhoAjhkAKQA4AFgB2AAfAggCTgJfAqAAEwAKAx0DLwOIA+0EDwTRAAEFkwW6BgEGNAZHBl0GZgAnCIGdILlIIkMnCYGIILlIIkOCAgFkBAABAgO/IkMiQzEZFDEYFBBDIhYnDUy/gQYWJw5MvyJDJw2+REkXFkxLARJEJw6+REkXFkxLARJEUCcETFCwIkM2GgEXNhoCNhoDTwIWJwVMvycHvEgnB0sCvym8SClLAb9LAVcCACcGvEgnBksBvyuBkDC5SIEqFishBE8CuyshBIAIAAAAAAAAACq7JwW+RBeBAwgWJwVMvycFvUglEkQnB71ISwMVEkQpvURLAhVKEkQnBr1ISwMVShJEKSQiuksGVwABEkRLAyIJKUwiuksDIglLB0wiWBJEIksEDEsEIk8CTUsETAkpJE8CuiJLBA8iSwVPAk1LBEwJSwckTwJSEkQjSwQMTwQjTwJNKSRPArojSwQPI08FTwJNTwUkTwJSEkQnBiQiuk8EVwIBEkRLASIJJwZMIrpLASIJSwRMIlgSRCJLAgxLAiJPAk1LAkwJJwYkTwK6IksCDyJLA08CTUsCTAlLBCRPAlISRIEFSwIMSwKBBU8CTScGJE8CuoEFSwIPgQVLA08CTUsEJE8CUhJEI0sCDE8CI08CTScGJE8CuiNLAg8jTwNPAk1PAiRPAlISRCu9SIGQMBJEIkMnBb1FAScHvU4CSCm9TgNIK71OBEiAAQAkTwJUIk8CVCNPAlSBA08CVCcETFCwIkMnBb5EFyIIIgknB75EVwIAKb5EKyEEJboXTwMWSwMVFlcGAk8EUEyAAgAUUEsBFYEUCBZXBgJQTwIWUExQTFAnBExQsCJDKyEEJboXIggWKyEETwK7IkMnBbxIJwe8SCm8SCcFvkwXgSpLAUsDTYEqEkQnB74nC04CTVcCAIACNDISRCm+JwtOAk0nCxJETBREFEQrvEgiQycKvEgnCoATVGVzdGluZyB0ZXN0aW5nIDEyM78nCr1ISSRLAk2BB0sCDE8CgQdPAk1LAQknCk4CuoAHVGVzdGluZxJEKbxIKYAHAAVIZWxsb78pvUgjSwEMSwEjTwJNgQpLAgxPAoEKTwJNSwEJKU4CuoAFSGVsbG8SRCJDNhoBFzYaAkwlCycJTE8CuyJDgABJgY5SMgwNQQAYsYEGshCBBbIZJw+yHicPsh8ksgGzQv/fJEUBJwm9RQFEJEUCSwGBgQQMQQAXSwFJJQsnCUwluhdLAghFAiIIRQJC/+BJFicETFCwIkMqvUUBFEQqgSC5RDEAMgoqJEsDuyqBwD7TKiRJSwPSKoFAJwy7KiSBRbpLAUsDUCcMUBJEKrxIKr5JFERLAYAAEkRLA04CTUsCEkRQKrxIKky/Kr1IgUASRCcQgSC5SCcQvEgiQzYaASRbRDYaAUkVIQUIKEy5SCghBIACEAK7KCEFTwK7IkM2GgEXNhoCSRcoIQVPA7tJIggWKIGOIE8Cu0kjCBYogaggI7oXSwMNRCNLAwshBksBCChMI7oXIQYIKEsBI7oXSwUNRCMISwQlC0xLAQgoTE8Eu0sCgQMIFiiBliBPArtLAoEECBYogaAgTwK7TwKBBQgWKIGMICO6FyEFCChLASO6F0sFDUQjCElLBAgoTCO6FwiBEggoSwEjuhdLBQ1EIwhJTwQIKEwjuhcIKEsBI7oXTwQNRCMITwIIKExPArsiQzYaARc2GgIXNhoDFyghBSW6FyiBjiAluhcogaggI7oXSwUNRCNLBQshBksBCChMI7oXIQYIKEsBI7oXSwYNRCMISwUlCwgoTCW6FyiBliAluhcogaAgJboXKIGMICO6FyEFCChLASO6F08KDUQjCElPBQgoTCO6FwiBEggoSwEjuhdLCA1EIwgjTwgLSwEIKEwjuhcIKEsBI7oXSwcNRCMITwYlCwgoTCW6F08FTwUITwQITwMITwIICBYnBExQsCJDNhoBFzYaAiRTSwElCk8CJRgnCEsCIrpLASUMRExPA1QnCE4CuyJDNhoBFyQnCL1FAUQkSYHogQIMQQAoRwIlCkwlGCcITwIiukxTQQAGSwEiCEUCSwFLAxJAAAhJIghFAUL/z0sBFicETFCwIkMkFkm8SEmABkhtbW1tbb+9SIEGEkQiFkm+JxFOAk0nERJESb1FARRESbxISScMv7xIIkM2GgEXNhoCVwIATBZJvEhMvyJDNhoBFxa+REkVFlcGAkxQJwRMULAiQzYaARcWvEgiQzYaARcWvUUBgAEAJE8CVCcETFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/BoxContract/data/BoxContract.clear.teal b/tests/artifacts/BoxContract/data/BoxContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/BoxContract/data/BoxContract.clear.teal +++ b/tests/artifacts/BoxContract/data/BoxContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Contains/data/MyContract.approval.teal b/tests/artifacts/Contains/data/MyContract.approval.teal index f474884c..fa4fd569 100644 --- a/tests/artifacts/Contains/data/MyContract.approval.teal +++ b/tests/artifacts/Contains/data/MyContract.approval.teal @@ -18,7 +18,7 @@ main: callsub is_in_tuple_1 // tests/artifacts/Contains/contract.py:11 // one_false = self.is_in_tuple_1(UInt64(5), (UInt64(10), not_ten, Bytes(b"five"))) - pushint 5 // 5 + pushint 5 intc_2 // 10 // tests/artifacts/Contains/contract.py:8 // not_ten = UInt64(15) diff --git a/tests/artifacts/Contains/data/MyContract.clear.teal b/tests/artifacts/Contains/data/MyContract.clear.teal index da06aa18..199b0c3c 100644 --- a/tests/artifacts/Contains/data/MyContract.clear.teal +++ b/tests/artifacts/Contains/data/MyContract.clear.teal @@ -5,5 +5,5 @@ main: // tests/artifacts/Contains/contract.py:40 // return UInt64(1) - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal b/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal index f493b90c..a34f8411 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal +++ b/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal @@ -19,7 +19,7 @@ main_some_value_route@3: ! txn ApplicationID && - assert // OnCompletion must be NoOp && can only call when not creating + assert b some_value main___algopy_default_create@5: @@ -28,8 +28,6 @@ main___algopy_default_create@5: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return @@ -39,7 +37,7 @@ some_value: // return Global.group_size * (Txn.group_index + 1) global GroupSize txn GroupIndex - pushint 1 // 1 + pushint 1 + * // tests/artifacts/CreatedAppAsset/other.py:5 @@ -49,5 +47,5 @@ some_value: swap concat log - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json b/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json index 9f999885..5b416926 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json +++ b/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json @@ -54,20 +54,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 37 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 26 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when not creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -76,19 +63,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBzb21lX3ZhbHVlCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQub3RoZXIuQXBwQ2FsbC5zb21lX3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKc29tZV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NwogICAgLy8gcmV0dXJuIEdsb2JhbC5ncm91cF9zaXplICogKFR4bi5ncm91cF9pbmRleCArIDEpCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxIC8vIDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NAogICAgLy8gY2xhc3MgQXBwQ2FsbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3NvbWVfdmFsdWVfcm91dGVAMwogICAgZXJyCgptYWluX3NvbWVfdmFsdWVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHNvbWVfdmFsdWUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5vdGhlci5BcHBDYWxsLnNvbWVfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpzb21lX3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9vdGhlci5weTo3CiAgICAvLyByZXR1cm4gR2xvYmFsLmdyb3VwX3NpemUgKiAoVHhuLmdyb3VwX2luZGV4ICsgMSkKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDEKICAgICsKICAgICoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvb3RoZXIucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgALMRkUMRgUEESBAUMyBDEWgQEICxaABBUffHVMULCBAUM=", + "approval": "CzEbQQAYgATTR55lNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEMyBDEWgQEICxaABBUffHVMULCBAUM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/CreatedAppAsset/data/AppCall.clear.teal b/tests/artifacts/CreatedAppAsset/data/AppCall.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppCall.clear.teal +++ b/tests/artifacts/CreatedAppAsset/data/AppCall.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal index ca9a0ccf..65da5fdf 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal +++ b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@9 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x6d3a0439 0x62a0ef62 // method "create_group(acfg,appl)(uint64,uint64)", method "log_group(appl)void" @@ -25,8 +25,6 @@ main___algopy_default_create@9: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -35,7 +33,7 @@ create_group: // tests/artifacts/CreatedAppAsset/contract.py:5 // @arc4.abimethod txn GroupIndex - pushint 2 // 2 + pushint 2 - dup gtxns TypeEnum @@ -116,7 +114,7 @@ log_group: // tests/artifacts/CreatedAppAsset/contract.py:24 // assert app_call.app_args(0) == arc4.arc4_signature( dup - pushint 0 // 0 + pushint 0 gtxnsas ApplicationArgs // tests/artifacts/CreatedAppAsset/contract.py:24-26 // assert app_call.app_args(0) == arc4.arc4_signature( @@ -156,6 +154,13 @@ log_group: // == (app_call.group_index + 1) * Global.group_size itob b== + // tests/artifacts/CreatedAppAsset/contract.py:28-31 + // assert ( + // arc4.UInt64.from_log(app_call.last_log) + // == (app_call.group_index + 1) * Global.group_size + // ) + assert // tests/artifacts/CreatedAppAsset/contract.py:22 // @arc4.abimethod + intc_0 // 1 return diff --git a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json index 82abebfc..e8984331 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json +++ b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json @@ -87,68 +87,56 @@ "sourceInfo": [ { "pc": [ - 20 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 53 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 161 + 159 ], "errorMessage": "application log value is not the result of an ABI return" }, { "pc": [ - 98 + 96 ], "errorMessage": "expected app created" }, { "pc": [ - 83 + 81 ], "errorMessage": "expected asset created" }, { "pc": [ - 107 + 105 ], "errorMessage": "expected correct app id" }, { "pc": [ - 92 + 90 ], "errorMessage": "expected correct asset id" }, { "pc": [ - 141 + 139 ], "errorMessage": "expected correct method called" }, { "pc": [ - 147 + 145 ], "errorMessage": "expected logs" }, { "pc": [ - 67 + 65 ], "errorMessage": "transaction type is acfg" }, { "pc": [ - 77, - 128 + 75, + 126 ], "errorMessage": "transaction type is appl" } @@ -161,19 +149,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDZkM2EwNDM5IDB4NjJhMGVmNjIgLy8gbWV0aG9kICJjcmVhdGVfZ3JvdXAoYWNmZyxhcHBsKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAibG9nX2dyb3VwKGFwcGwpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZV9ncm91cCBsb2dfZ3JvdXAKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3JlYXRlZEFwcEFzc2V0LmNvbnRyYWN0LkFwcEV4cGVjdGluZ0VmZmVjdHMuY3JlYXRlX2dyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlX2dyb3VwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCAzIC8vIGFjZmcKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhY2ZnCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgY3JlYXRlZCIKICAgIGRpZyAxCiAgICBndHhucyBDcmVhdGVkQXNzZXRJRAogICAgZHVwCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgY3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMwogICAgLy8gb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICB1bmNvdmVyIDIKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIGdhaWRzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTItMTQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhc3NldCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZCwgImV4cGVjdGVkIGFwcCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHAgY3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNwogICAgLy8gb3AuZ2FpZChhcHBfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICB1bmNvdmVyIDIKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIGdhaWRzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTYtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhcHBfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3JlYXRlZEFwcEFzc2V0LmNvbnRyYWN0LkFwcEV4cGVjdGluZ0VmZmVjdHMubG9nX2dyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKbG9nX2dyb3VwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICBkdXAKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBBcHBFeHBlY3RpbmdFZmZlY3RzKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVfZ3JvdXAgbG9nX2dyb3VwCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyZWF0ZWRBcHBBc3NldC5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNyZWF0ZV9ncm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZV9ncm91cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBhc3NlcnQgYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBjcmVhdGVkIgogICAgZGlnIDEKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxMi0xNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFzc2V0X2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXNzZXRfY3JlYXRlLmNyZWF0ZWRfYXNzZXQuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXNzZXQgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBkaWcgMQogICAgZ3R4bnMgQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBjcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToxNi0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IGFwcCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFwcCBpZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcmVhdGVkQXBwQXNzZXQuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dfZ3JvdXA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIGR1cAogICAgcHVzaGludCAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyNC0yNgogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICAvLyAgICAgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgIC8vICksICJleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQiCiAgICBwdXNoYnl0ZXMgMHhkMzQ3OWU2NSAvLyBtZXRob2QgInNvbWVfdmFsdWUoKXVpbnQ2NCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgY29ycmVjdCBtZXRob2QgY2FsbGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwubnVtX2xvZ3MgPT0gMSwgImV4cGVjdGVkIGxvZ3MiCiAgICBkdXAKICAgIGd0eG5zIE51bUxvZ3MKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvZ3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZHVwCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjMwCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBzd2FwCiAgICBndHhucyBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyZWF0ZWRBcHBBc3NldC9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcmVhdGVkQXBwQXNzZXQvY29udHJhY3QucHk6MjgtMzEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyAgICAgPT0gKGFwcF9jYWxsLmdyb3VwX2luZGV4ICsgMSkgKiBHbG9iYWwuZ3JvdXBfc2l6ZQogICAgLy8gKQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3JlYXRlZEFwcEFzc2V0L2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACwBKADEZFDEYFBBEIkMxFoECCUk4EIEDEkQxFiIJSTgQIxJESwE4PElETwI4Fj1LARJESwE4PUlETwI4Fj1LARJETBZMFlAoTFCwIkMxFiIJSTgQIxJESYEAwhqABNNHnmUSREk4OyISREk4PklXBABMVwAEKBJETDgWIggyBAsWqEM=", + "approval": "CyACAQYmAQQVH3x1MRtBAB0xGRREMRhEggIEbToEOQRioO9iNhoAjgIACQBIADEZFDEYFBBDMRaBAglJOBCBAxJEMRYiCUk4ECMSREsBODxJRE8COBY9SwESREsBOD1JRE8COBY9SwESREwWTBZQKExQsCJDMRYiCUk4ECMSREmBAMIagATTR55lEkRJODsiEkRJOD5JVwQATFcABCgSREw4FiIIMgQLFqhEIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal +++ b/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal b/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal index 5e686b8d..9c47acb4 100644 --- a/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal +++ b/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@20 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x3456c4c3 0xe8442b84 0x65f567aa 0x258455b1 0x35af0f38 0x6582c997 0x6298ffbb 0x3885b54f 0x2164e0bf 0x755b79a5 0xf06bb077 0x133f8ccc 0x2f7c68a9 // method "verify_sha256(byte[],uint64)byte[]", method "verify_sha3_256(byte[],uint64)byte[]", method "verify_keccak_256(byte[],uint64)byte[]", method "verify_sha512_256(byte[],uint64)byte[]", method "verify_ed25519verify(byte[],byte[],byte[])bool", method "verify_ed25519verify_bare(byte[],byte[],byte[])bool", method "verify_ecdsa_verify_k1(byte[],byte[],byte[],byte[],byte[])bool", method "verify_ecdsa_verify_r1(byte[],byte[],byte[],byte[],byte[])bool", method "verify_ecdsa_recover_k1(byte[],uint64,byte[],byte[])(byte[],byte[])", method "verify_ecdsa_recover_r1(byte[],uint64,byte[],byte[])(byte[],byte[])", method "verify_ecdsa_decompress_k1(byte[])(byte[],byte[])", method "verify_ecdsa_decompress_r1(byte[])(byte[],byte[])", method "verify_vrf_verify(byte[],byte[],byte[])(byte[],bool)" @@ -25,8 +25,6 @@ main___algopy_default_create@20: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_1 // 1 return @@ -34,7 +32,7 @@ main___algopy_default_create@20: ensure_budget: proto 2 0 frame_dig -2 - pushint 10 // 10 + pushint 10 + ensure_budget_while_top@1: @@ -188,7 +186,7 @@ verify_ed25519verify: extract 2 0 // tests/artifacts/CryptoOps/contract.py:31 // ensure_budget(1900, OpUpFeeSource.GroupCredit) - pushint 1900 // 1900 + pushint 1900 intc_0 // 0 callsub ensure_budget // tests/artifacts/CryptoOps/contract.py:32 @@ -222,7 +220,7 @@ verify_ed25519verify_bare: extract 2 0 // tests/artifacts/CryptoOps/contract.py:37 // ensure_budget(1900, OpUpFeeSource.GroupCredit) - pushint 1900 // 1900 + pushint 1900 intc_0 // 0 callsub ensure_budget // tests/artifacts/CryptoOps/contract.py:38 @@ -436,7 +434,7 @@ verify_ecdsa_decompress_k1: extract 2 0 // tests/artifacts/CryptoOps/contract.py:72 // ensure_budget(700, OpUpFeeSource.GroupCredit) - pushint 700 // 700 + pushint 700 intc_0 // 0 callsub ensure_budget // tests/artifacts/CryptoOps/contract.py:73 @@ -486,7 +484,7 @@ verify_ecdsa_decompress_r1: extract 2 0 // tests/artifacts/CryptoOps/contract.py:77 // ensure_budget(700, OpUpFeeSource.GroupCredit) - pushint 700 // 700 + pushint 700 intc_0 // 0 callsub ensure_budget // tests/artifacts/CryptoOps/contract.py:78 @@ -540,7 +538,7 @@ verify_vrf_verify: extract 2 0 // tests/artifacts/CryptoOps/contract.py:82 // ensure_budget(5700, OpUpFeeSource.GroupCredit) - pushint 5700 // 5700 + pushint 5700 intc_0 // 0 callsub ensure_budget // tests/artifacts/CryptoOps/contract.py:83 diff --git a/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json b/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json index fccf49e8..30b843ad 100644 --- a/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json +++ b/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json @@ -408,20 +408,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 39 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 149 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -430,19 +417,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDM0NTZjNGMzIDB4ZTg0NDJiODQgMHg2NWY1NjdhYSAweDI1ODQ1NWIxIDB4MzVhZjBmMzggMHg2NTgyYzk5NyAweDYyOThmZmJiIDB4Mzg4NWI1NGYgMHgyMTY0ZTBiZiAweDc1NWI3OWE1IDB4ZjA2YmIwNzcgMHgxMzNmOGNjYyAweDJmN2M2OGE5IC8vIG1ldGhvZCAidmVyaWZ5X3NoYTI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NoYTNfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfa2VjY2FrXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NoYTUxMl8yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9lZDI1NTE5dmVyaWZ5KGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUoYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMShieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfcjEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMShieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMShieXRlW10sdWludDY0LGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMShieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMShieXRlW10pKGJ5dGVbXSxieXRlW10pIiwgbWV0aG9kICJ2ZXJpZnlfdnJmX3ZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X3NoYTI1NiB2ZXJpZnlfc2hhM18yNTYgdmVyaWZ5X2tlY2Nha18yNTYgdmVyaWZ5X3NoYTUxMl8yNTYgdmVyaWZ5X2VkMjU1MTl2ZXJpZnkgdmVyaWZ5X2VkMjU1MTl2ZXJpZnlfYmFyZSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxIHZlcmlmeV9lY2RzYV92ZXJpZnlfcjEgdmVyaWZ5X2VjZHNhX3JlY292ZXJfazEgdmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEgdmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEgdmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEgdmVyaWZ5X3ZyZl92ZXJpZnkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9zaGEyNTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hhMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NwogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6OAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KGEpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhM18yNTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hhM18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTMKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBvcC5zaGEzXzI1NihhKQogICAgc2hhM18yNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2tlY2Nha18yNTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfa2VjY2FrXzI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxOQogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MjAKICAgIC8vIHJlc3VsdCA9IG9wLmtlY2NhazI1NihhKQogICAga2VjY2FrMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9zaGE1MTJfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTUxMl8yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MjUKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyByZXN1bHQgPSBvcC5zaGE1MTJfMjU2KGEpCiAgICBzaGE1MTJfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VkMjU1MTl2ZXJpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMQogICAgLy8gZW5zdXJlX2J1ZGdldCgxOTAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCAxOTAwIC8vIDE5MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzIKICAgIC8vIHJlc3VsdCA9IG9wLmVkMjU1MTl2ZXJpZnkoYSwgYiwgYykKICAgIGVkMjU1MTl2ZXJpZnkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VkMjU1MTl2ZXJpZnlfYmFyZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDE5MDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDE5MDAgLy8gMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwIC8vIDcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MwogICAgLy8gcmV0dXJuIG9wLmVjZHNhX3BrX2RlY29tcHJlc3Mob3AuRUNEU0EuU2VjcDI1NmsxLCBhKQogICAgZWNkc2FfcGtfZGVjb21wcmVzcyBTZWNwMjU2azEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMyAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NwogICAgLy8gZW5zdXJlX2J1ZGdldCg3MDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDcwMCAvLyA3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJldHVybiBvcC5lY2RzYV9wa19kZWNvbXByZXNzKG9wLkVDRFNBLlNlY3AyNTZyMSwgYSkKICAgIGVjZHNhX3BrX2RlY29tcHJlc3MgU2VjcDI1NnIxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzMgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV92cmZfdmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3ZyZl92ZXJpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MgogICAgLy8gZW5zdXJlX2J1ZGdldCg1NzAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCA1NzAwIC8vIDU3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODMKICAgIC8vIHJlc3VsdCA9IG9wLnZyZl92ZXJpZnkob3AuVnJmVmVyaWZ5LlZyZkFsZ29yYW5kLCBhLCBiLCBjKQogICAgdnJmX3ZlcmlmeSBWcmZBbGdvcmFuZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzAwMCA0CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMCAweDE1MWY3Yzc1MDAyMCAweDAwMDQgMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ3J5cHRvT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgzNDU2YzRjMyAweGU4NDQyYjg0IDB4NjVmNTY3YWEgMHgyNTg0NTViMSAweDM1YWYwZjM4IDB4NjU4MmM5OTcgMHg2Mjk4ZmZiYiAweDM4ODViNTRmIDB4MjE2NGUwYmYgMHg3NTViNzlhNSAweGYwNmJiMDc3IDB4MTMzZjhjY2MgMHgyZjdjNjhhOSAvLyBtZXRob2QgInZlcmlmeV9zaGEyNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGEzXzI1NihieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2tlY2Nha18yNTYoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGE1MTJfMjU2KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlKGJ5dGVbXSxieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9lY2RzYV92ZXJpZnlfazEoYnl0ZVtdLGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxKGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfazEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX3JlY292ZXJfcjEoYnl0ZVtdLHVpbnQ2NCxieXRlW10sYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfazEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X2VjZHNhX2RlY29tcHJlc3NfcjEoYnl0ZVtdKShieXRlW10sYnl0ZVtdKSIsIG1ldGhvZCAidmVyaWZ5X3ZyZl92ZXJpZnkoYnl0ZVtdLGJ5dGVbXSxieXRlW10pKGJ5dGVbXSxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9zaGEyNTYgdmVyaWZ5X3NoYTNfMjU2IHZlcmlmeV9rZWNjYWtfMjU2IHZlcmlmeV9zaGE1MTJfMjU2IHZlcmlmeV9lZDI1NTE5dmVyaWZ5IHZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmUgdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMSB2ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxIHZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxIHZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxIHZlcmlmeV92cmZfdmVyaWZ5CiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjA6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTI1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihhKQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5DcnlwdG9PcHMuY29udHJhY3QuQ3J5cHRvT3BzQ29udHJhY3QudmVyaWZ5X3NoYTNfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NoYTNfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhM18yNTYoYSkKICAgIHNoYTNfMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9rZWNjYWtfMjU2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2tlY2Nha18yNTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MTkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyByZXN1bHQgPSBvcC5rZWNjYWsyNTYoYSkKICAgIGtlY2NhazI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfc2hhNTEyXzI1Nltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaGE1MTJfMjU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyNgogICAgLy8gcmVzdWx0ID0gb3Auc2hhNTEyXzI1NihhKQogICAgc2hhNTEyXzI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWQyNTUxOXZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lZDI1NTE5dmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMgogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeShhLCBiLCBjKQogICAgZWQyNTUxOXZlcmlmeQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozMwogICAgLy8gcmV0dXJuIGFyYzQuQm9vbChyZXN1bHQpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weToyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQ3J5cHRvT3BzLmNvbnRyYWN0LkNyeXB0b09wc0NvbnRyYWN0LnZlcmlmeV9lZDI1NTE5dmVyaWZ5X2JhcmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZWQyNTUxOXZlcmlmeV9iYXJlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzcKICAgIC8vIGVuc3VyZV9idWRnZXQoMTkwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgMTkwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTozOAogICAgLy8gcmVzdWx0ID0gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKGEsIGIsIGMpCiAgICBlZDI1NTE5dmVyaWZ5X2JhcmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJldHVybiBhcmM0LkJvb2wocmVzdWx0KQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X2sxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9rMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHRfazEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NmsxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfdmVyaWZ5X3IxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2VjZHNhX3ZlcmlmeV9yMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXN1bHRfcjEgPSBvcC5lY2RzYV92ZXJpZnkob3AuRUNEU0EuU2VjcDI1NnIxLCBhLCBiLCBjLCBkLCBlKQogICAgZWNkc2FfdmVyaWZ5IFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NTcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2azEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfcmVjb3Zlcl9yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9yZWNvdmVyX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6NjcKICAgIC8vIGVuc3VyZV9idWRnZXQoMzAwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIGludGNfMiAvLyAzMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfcmVjb3ZlcihvcC5FQ0RTQS5TZWNwMjU2cjEsIGEsIGIsIGMsIGQpCiAgICBlY2RzYV9wa19yZWNvdmVyIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19rMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX2sxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjczCiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2azEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZrMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfZWNkc2FfZGVjb21wcmVzc19yMVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9lY2RzYV9kZWNvbXByZXNzX3IxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gb3AuZWNkc2FfcGtfZGVjb21wcmVzcyhvcC5FQ0RTQS5TZWNwMjU2cjEsIGEpCiAgICBlY2RzYV9wa19kZWNvbXByZXNzIFNlY3AyNTZyMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18zIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkNyeXB0b09wcy5jb250cmFjdC5DcnlwdG9PcHNDb250cmFjdC52ZXJpZnlfdnJmX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV92cmZfdmVyaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9DcnlwdG9PcHMvY29udHJhY3QucHk6ODIKICAgIC8vIGVuc3VyZV9idWRnZXQoNTcwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNTcwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0NyeXB0b09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AudnJmX3ZlcmlmeShvcC5WcmZWZXJpZnkuVnJmQWxnb3JhbmQsIGEsIGIsIGMpCiAgICB2cmZfdmVyaWZ5IFZyZkFsZ29yYW5kCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQ3J5cHRvT3BzL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBGAFoAbgCCAJYAuwDgARABQAGIAdACCgJEADEZFDEYFBBEI0OKAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJwSyHicEsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viTYaAVcCADYaAhevTFABKkxQsCNDNhoBVwIANhoCF69MUJgqTFCwI0M2GgFXAgA2GgIXr0xQAipMULAjQzYaAVcCADYaAhevTFADKkxQsCNDNhoBVwIANhoCVwIANhoDVwIAgewOIoj/XAQpIk8CVChMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/zeEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgA2GgRXAgA2GgVXAgAkIoj/CAUAKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgA2GgRXAgA2GgVXAgAkIoj+2AUBKSJPAlQoTFCwI0M2GgFXAgA2GgIXNhoDVwIANhoEVwIAJCKI/rAHAEsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgIXNhoDVwIANhoEVwIAJCKI/mgHAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgCBvAUiiP4uBgBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj99AYBSwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCADYaAlcCADYaA1cCAIHELCKI/a7QAEsBFRZXBgJPAlApIk8DVIACAANMUExQKExQsCND", + "approval": "CyAEAAG4FwQmBQQVH3x1AQAGFR98dQAgAgAEAwaBATEbQQBqMRkURDEYRIINBDRWxMME6EQrhARl9WeqBCWEVbEENa8POARlgsmXBGKY/7sEOIW1TwQhZOC/BHVbeaUE8GuwdwQTP4zMBC98aKk2GgCODQBEAFgAbACAAJQAuQDeAQ4BPgGGAc4CCAJCADEZFDEYFBBDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScEsh4nBLIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFXAgA2GgIXr0xQASpMULAjQzYaAVcCADYaAhevTFCYKkxQsCNDNhoBVwIANhoCF69MUAIqTFCwI0M2GgFXAgA2GgIXr0xQAypMULAjQzYaAVcCADYaAlcCADYaA1cCAIHsDiKI/1wEKSJPAlQoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCB7A4iiP83hCkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/wgFACkiTwJUKExQsCNDNhoBVwIANhoCVwIANhoDVwIANhoEVwIANhoFVwIAJCKI/tgFASkiTwJUKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP6wBwBLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIANhoCFzYaA1cCADYaBFcCACQiiP5oBwFLARUWVwYCTwJQSRUlCEsCFRZXBgJPA1BMFlcGAitMUE8CUExQKExQsCNDNhoBVwIAgbwFIoj+LgYASwEVFlcGAk8CUEkVJQhLAhUWVwYCTwNQTBZXBgIrTFBPAlBMUChMULAjQzYaAVcCAIG8BSKI/fQGAUsBFRZXBgJPAlBJFSUISwIVFlcGAk8DUEwWVwYCK0xQTwJQTFAoTFCwI0M2GgFXAgA2GgJXAgA2GgNXAgCBxCwiiP2u0ABLARUWVwYCTwJQKSJPA1SAAgADTFBMUChMULAjQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal b/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal +++ b/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal index 67247009..d38f87b5 100644 --- a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal +++ b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal @@ -20,7 +20,7 @@ main_validate_g_args_route@3: ! txn ApplicationID && - assert // OnCompletion must be NoOp && can only call when not creating + assert b validate_g_args main___algopy_default_create@5: @@ -29,8 +29,6 @@ main___algopy_default_create@5: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return @@ -65,7 +63,7 @@ validate_g_args: pushint 6 // appl == assert // transaction type is appl - pushint 1 // 1 + pushint 1 gtxnsas ApplicationArgs dig 1 == @@ -73,7 +71,7 @@ validate_g_args: // tests/artifacts/GlobalStateValidator/contract.py:11 // assert gtxn.Transaction(Txn.group_index).app_args(1) == arg1.bytes txn GroupIndex - pushint 1 // 1 + pushint 1 gtxnsas ApplicationArgs dig 1 == @@ -89,6 +87,8 @@ validate_g_args: // assert op.Txn.application_args(1) == arg1.bytes txna ApplicationArgs 1 == + assert // tests/artifacts/GlobalStateValidator/contract.py:5 // @arc4.abimethod + pushint 1 return diff --git a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json index f0a6f5db..466c34d7 100644 --- a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json +++ b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json @@ -66,19 +66,7 @@ "sourceInfo": [ { "pc": [ - 39 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 28 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when not creating" - }, - { - "pc": [ - 75 + 72 ], "errorMessage": "transaction type is appl" } @@ -91,19 +79,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiB2YWxpZGF0ZV9nX2FyZ3MKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkdsb2JhbFN0YXRlVmFsaWRhdG9yLmNvbnRyYWN0Lkdsb2JhbFN0YXRlVmFsaWRhdG9yLnZhbGlkYXRlX2dfYXJnc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZhbGlkYXRlX2dfYXJnczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo3CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo4CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikgPT0gYXJnMi5ieXRlcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBhc3NlcnQgZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbihUeG4uZ3JvdXBfaW5kZXgpLmFwcF9hcmdzKDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHB1c2hpbnQgMSAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxIC8vIDEKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBhc3NlcnQgb3AuR1R4bi5hcHBsaWNhdGlvbl9hcmdzKFR4bi5ncm91cF9pbmRleCwgMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGd0eG5zYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMwogICAgLy8gYXNzZXJ0IG9wLlR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpID09IGFyZzEuYnl0ZXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHhjMGViNWM2NwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIEdsb2JhbFN0YXRlVmFsaWRhdG9yKEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBieXRlY18wIC8vIG1ldGhvZCAidmFsaWRhdGVfZ19hcmdzKHVpbnQ2NCxzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmFsaWRhdGVfZ19hcmdzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92YWxpZGF0ZV9nX2FyZ3Nfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHZhbGlkYXRlX2dfYXJncwoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuR2xvYmFsU3RhdGVWYWxpZGF0b3IuY29udHJhY3QuR2xvYmFsU3RhdGVWYWxpZGF0b3IudmFsaWRhdGVfZ19hcmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmFsaWRhdGVfZ19hcmdzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjcKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygwKSA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKCJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzAgLy8gbWV0aG9kICJ2YWxpZGF0ZV9nX2FyZ3ModWludDY0LHN0cmluZyl2b2lkIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjgKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0dsb2JhbFN0YXRlVmFsaWRhdG9yL2NvbnRyYWN0LnB5OjkKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmcyLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTAKICAgIC8vIGFzc2VydCBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCkuYXBwX2FyZ3MoMSkgPT0gYXJnMS5ieXRlcwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMQogICAgLy8gYXNzZXJ0IGd0eG4uVHJhbnNhY3Rpb24oVHhuLmdyb3VwX2luZGV4KS5hcHBfYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9HbG9iYWxTdGF0ZVZhbGlkYXRvci9jb250cmFjdC5weToxMgogICAgLy8gYXNzZXJ0IG9wLkdUeG4uYXBwbGljYXRpb25fYXJncyhUeG4uZ3JvdXBfaW5kZXgsIDEpID09IGFyZzEuYnl0ZXMKICAgIHR4biBHcm91cEluZGV4CiAgICBndHhuc2EgQXBwbGljYXRpb25BcmdzIDEKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6MTMKICAgIC8vIGFzc2VydCBvcC5UeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBhcmcxLmJ5dGVzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvR2xvYmFsU3RhdGVWYWxpZGF0b3IvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAsxGRQxGBQQRIEBQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJD", + "approval": "CyYBBMDrXGcxG0EAEyg2GgCOAQABADEZFDEYEERCAAgxGRQxGBQQQzYaATYaAjYaACgSRDYaAUsCEkQ2GgISRDEWSTgQgQYSRIEBwhpLARJEMRaBAcIaSwESRDEWORoBSwESRDYaARJEgQFD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal +++ b/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal index 658ebb50..d60839c6 100644 --- a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal +++ b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@44 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x45847eea 0xf57aceb5 0x7d631730 0xa1b24441 0xcd7be1ac 0x7cfda64b 0x54a910d9 0xc46568de 0x7a46a6ae 0x04372209 0x7e5f6d72 0x24ebcf84 0x9c0b3397 0x0ad40da4 0x95178870 0xdeedc99b 0xab2150bb 0x02a54017 0x3db66b41 0x6e3ff38c 0x8f3b9f18 0x16166f9a 0x2f472065 0xd5a739c3 0x61f3b3e1 0x56cf368b 0x919ffbd2 0xaae8b697 0x847422b1 0xd5260327 0x114c8c6d 0x39e9e62a 0xd6a4c05e 0x1ef8151a 0x66dd7f96 0x4d9eceb2 0x19ba70ee // method "verify_addw(uint64,uint64)(uint64,uint64)", method "verify_base64_decode_standard(byte[])byte[]", method "verify_base64_decode_url(byte[])byte[]", method "verify_bytes_bitlen(byte[],uint64)uint64", method "verify_uint64_bitlen(uint64)uint64", method "verify_bsqrt(byte[])byte[]", method "verify_btoi(byte[])uint64", method "verify_bzero(uint64)byte[]", method "verify_concat(byte[],byte[],uint64,uint64)byte[]", method "verify_divmodw(uint64,uint64,uint64,uint64)(uint64,uint64,uint64,uint64)", method "verify_divw(uint64,uint64,uint64)uint64", method "verify_err()void", method "verify_exp(uint64,uint64)uint64", method "verify_expw(uint64,uint64)(uint64,uint64)", method "verify_extract(byte[],uint64,uint64)byte[]", method "verify_extract_from_2(byte[])byte[]", method "verify_extract_uint16(byte[],uint64)uint64", method "verify_extract_uint32(byte[],uint64)uint64", method "verify_extract_uint64(byte[],uint64)uint64", method "verify_getbit_bytes(byte[],uint64)bool", method "verify_getbit_uint64(uint64,uint64)bool", method "verify_getbyte(byte[],uint64)uint64", method "verify_itob(uint64)byte[]", method "verify_mulw(uint64,uint64)(uint64,uint64)", method "verify_replace(byte[],uint64,byte[])byte[]", method "verify_select_bytes(byte[],byte[],uint64)byte[]", method "verify_select_uint64(uint64,uint64,uint64)uint64", method "verify_setbit_bytes(byte[],uint64,bool)byte[]", method "verify_setbit_uint64(uint64,uint64,bool)uint64", method "verify_setbyte(byte[],uint64,uint64)byte[]", method "verify_shl(uint64,uint64)uint64", method "verify_shr(uint64,uint64)uint64", method "verify_sqrt(uint64)uint64", method "verify_substring(byte[],uint64,uint64)byte[]", method "verify_json_ref_string(byte[],byte[])byte[]", method "verify_json_ref_uint64(byte[],byte[])uint64", method "verify_json_ref_object(byte[],byte[])byte[]" @@ -30,8 +30,6 @@ main___algopy_default_create@44: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -478,7 +476,7 @@ verify_extract_uint64: extract 2 0 txna ApplicationArgs 2 btoi - pushint 8 // 8 + pushint 8 extract3 bytec_0 // 0x151f7c75 swap diff --git a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json index 67aeaeda..87b83d25 100644 --- a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json +++ b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json @@ -970,20 +970,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 29 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 308 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -992,19 +979,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDQ1ODQ3ZWVhIDB4ZjU3YWNlYjUgMHg3ZDYzMTczMCAweGExYjI0NDQxIDB4Y2Q3YmUxYWMgMHg3Y2ZkYTY0YiAweDU0YTkxMGQ5IDB4YzQ2NTY4ZGUgMHg3YTQ2YTZhZSAweDA0MzcyMjA5IDB4N2U1ZjZkNzIgMHgyNGViY2Y4NCAweDljMGIzMzk3IDB4MGFkNDBkYTQgMHg5NTE3ODg3MCAweGRlZWRjOTliIDB4YWIyMTUwYmIgMHgwMmE1NDAxNyAweDNkYjY2YjQxIDB4NmUzZmYzOGMgMHg4ZjNiOWYxOCAweDE2MTY2ZjlhIDB4MmY0NzIwNjUgMHhkNWE3MzljMyAweDYxZjNiM2UxIDB4NTZjZjM2OGIgMHg5MTlmZmJkMiAweGFhZThiNjk3IDB4ODQ3NDIyYjEgMHhkNTI2MDMyNyAweDExNGM4YzZkIDB4MzllOWU2MmEgMHhkNmE0YzA1ZSAweDFlZjgxNTFhIDB4NjZkZDdmOTYgMHg0ZDllY2ViMiAweDE5YmE3MGVlIC8vIG1ldGhvZCAidmVyaWZ5X2FkZHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYml0bGVuKGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2JpdGxlbih1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYnNxcnQoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J0b2koYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2J6ZXJvKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9jb25jYXQoYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Rpdm1vZHcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZGl2dyh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9lcnIoKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leHAodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHB3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdChieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X2Zyb21fMihieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MTYoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQzMihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDY0KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Yml0X2J5dGVzKGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF91aW50NjQodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0Ynl0ZShieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2l0b2IodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X211bHcodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInZlcmlmeV9yZXBsYWNlKGJ5dGVbXSx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NlbGVjdF9ieXRlcyhieXRlW10sYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfdWludDY0KHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF9ieXRlcyhieXRlW10sdWludDY0LGJvb2wpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2V0Yml0X3VpbnQ2NCh1aW50NjQsdWludDY0LGJvb2wpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2V0Ynl0ZShieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9zaGwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zaHIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zcXJ0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zdWJzdHJpbmcoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfc3RyaW5nKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfdWludDY0KGJ5dGVbXSxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfanNvbl9yZWZfb2JqZWN0KGJ5dGVbXSxieXRlW10pYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FkZHcgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmQgdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsIHZlcmlmeV9ieXRlc19iaXRsZW4gdmVyaWZ5X3VpbnQ2NF9iaXRsZW4gdmVyaWZ5X2JzcXJ0IHZlcmlmeV9idG9pIHZlcmlmeV9iemVybyB2ZXJpZnlfY29uY2F0IHZlcmlmeV9kaXZtb2R3IHZlcmlmeV9kaXZ3IG1haW5fdmVyaWZ5X2Vycl9yb3V0ZUAxNSB2ZXJpZnlfZXhwIHZlcmlmeV9leHB3IHZlcmlmeV9leHRyYWN0IHZlcmlmeV9leHRyYWN0X2Zyb21fMiB2ZXJpZnlfZXh0cmFjdF91aW50MTYgdmVyaWZ5X2V4dHJhY3RfdWludDMyIHZlcmlmeV9leHRyYWN0X3VpbnQ2NCB2ZXJpZnlfZ2V0Yml0X2J5dGVzIHZlcmlmeV9nZXRiaXRfdWludDY0IHZlcmlmeV9nZXRieXRlIHZlcmlmeV9pdG9iIHZlcmlmeV9tdWx3IHZlcmlmeV9yZXBsYWNlIHZlcmlmeV9zZWxlY3RfYnl0ZXMgdmVyaWZ5X3NlbGVjdF91aW50NjQgdmVyaWZ5X3NldGJpdF9ieXRlcyB2ZXJpZnlfc2V0Yml0X3VpbnQ2NCB2ZXJpZnlfc2V0Ynl0ZSB2ZXJpZnlfc2hsIHZlcmlmeV9zaHIgdmVyaWZ5X3NxcnQgdmVyaWZ5X3N1YnN0cmluZyB2ZXJpZnlfanNvbl9yZWZfc3RyaW5nIHZlcmlmeV9qc29uX3JlZl91aW50NjQgdmVyaWZ5X2pzb25fcmVmX29iamVjdAogICAgZXJyCgptYWluX3ZlcmlmeV9lcnJfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo2OQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA0NDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9hZGR3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FkZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NwogICAgLy8gcmVzdWx0ID0gb3AuYWRkdyhhLCBiKQogICAgYWRkdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlN0ZEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBTdGRFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYmFzZTY0X2RlY29kZV91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNwogICAgLy8gcmVzdWx0ID0gb3AuYmFzZTY0X2RlY29kZShvcC5CYXNlNjQuVVJMRW5jb2RpbmcsIGEpCiAgICBiYXNlNjRfZGVjb2RlIFVSTEVuY29kaW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19iaXRsZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjIKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIzCiAgICAvLyByZXN1bHQgPSBvcC5iaXRsZW4oYSkKICAgIGJpdGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9iaXRsZW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI4CiAgICAvLyByZXN1bHQgPSBvcC5iaXRsZW4oYSkKICAgIGJpdGxlbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9ic3FydFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ic3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSBvcC5ic3FydChhX2JpZ3VpbnQpCiAgICBic3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnRvaVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9idG9pOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MzkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2koYSkKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnplcm9bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnplcm86CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHQgPSBvcC5iemVybyhhKQogICAgYnplcm8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfY29uY2F0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2NvbmNhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0OQogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpICsgYQogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1MAogICAgLy8gYiA9IG9wLmJ6ZXJvKHBhZF9iX3NpemUpICsgYgogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1MQogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdm1vZHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2bW9kdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IG9wLmRpdm1vZHcoYSwgYiwgYywgZCkKICAgIGRpdm1vZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZGl2d1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9kaXZ3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo2NAogICAgLy8gcmVzdWx0ID0gb3AuZGl2dyhhLCBiLCBjKQogICAgZGl2dwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHBbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MwogICAgLy8gcmVzdWx0ID0gb3AuZXhwKGEsIGIpCiAgICBleHAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHB3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3OAogICAgLy8gcmVzdWx0ID0gb3AuZXhwdyhhLCBiKQogICAgZXhwdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0KGEsIGIsIGMpCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF9mcm9tXzJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF9mcm9tXzI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0KGEsIDIsIDApCiAgICBleHRyYWN0IDQgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50MTZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50MTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo5MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdF91aW50MTYoYSwgYikKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDMyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDMyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDMyKGEsIGIpCiAgICBleHRyYWN0X3VpbnQzMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdDMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJpdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJpdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Yml0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gcmVzdWx0ID0gb3AuZ2V0Yml0KGEsIGIpCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzIgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9nZXRieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJ5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTE4CiAgICAvLyByZXN1bHQgPSBvcC5nZXRieXRlKGEsIGIpCiAgICBnZXRieXRlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9pdG9iW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2l0b2I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjMKICAgIC8vIHJlc3VsdCA9IG9wLml0b2IoYSkKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X211bHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfbXVsdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gcmVzdWx0ID0gb3AubXVsdyhhLCBiKQogICAgbXVsdwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9yZXBsYWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3JlcGxhY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gcmVzdWx0ID0gb3AucmVwbGFjZShhLCBiLCBjKQogICAgcmVwbGFjZTMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2VsZWN0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzgKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF9ieXRlcyhhLCBiLCBjKQogICAgc2VsZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2VsZWN0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQzCiAgICAvLyByZXN1bHQgPSBvcC5zZWxlY3RfdWludDY0KGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJpdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQ4CiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfYnl0ZXMoYSwgYiwgYykKICAgIHNldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJpdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Yml0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gb3Auc2V0Yml0X3VpbnQ2NChhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZXRieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJ5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTU4CiAgICAvLyByZXN1bHQgPSBvcC5zZXRieXRlKGEsIGIsIGMpCiAgICBzZXRieXRlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NobDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gcmVzdWx0ID0gb3Auc2hsKGEsIGIpCiAgICBzaGwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3Nocltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zaHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjgKICAgIC8vIHJlc3VsdCA9IG9wLnNocihhLCBiKQogICAgc2hyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zcXJ0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzMKICAgIC8vIHJlc3VsdCA9IG9wLnNxcnQoYSkKICAgIHNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3N1YnN0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdWJzdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc4CiAgICAvLyByZXN1bHQgPSBvcC5zdWJzdHJpbmcoYSwgYiwgYykKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9qc29uX3JlZl9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfanNvbl9yZWZfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODMKICAgIC8vIHJlc3VsdCA9IG9wLkpzb25SZWYuanNvbl9zdHJpbmcoYSwgYikKICAgIGpzb25fcmVmIEpTT05TdHJpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9qc29uX3JlZl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfanNvbl9yZWZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODgKICAgIC8vIHJlc3VsdCA9IG9wLkpzb25SZWYuanNvbl91aW50NjQoYSwgYikKICAgIGpzb25fcmVmIEpTT05VaW50NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX29iamVjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9vYmplY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX29iamVjdChhLCBiKQogICAganNvbl9yZWYgSlNPTk9iamVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDE1MWY3Yzc1MDAyMCAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBNaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDQ0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg0NTg0N2VlYSAweGY1N2FjZWI1IDB4N2Q2MzE3MzAgMHhhMWIyNDQ0MSAweGNkN2JlMWFjIDB4N2NmZGE2NGIgMHg1NGE5MTBkOSAweGM0NjU2OGRlIDB4N2E0NmE2YWUgMHgwNDM3MjIwOSAweDdlNWY2ZDcyIDB4MjRlYmNmODQgMHg5YzBiMzM5NyAweDBhZDQwZGE0IDB4OTUxNzg4NzAgMHhkZWVkYzk5YiAweGFiMjE1MGJiIDB4MDJhNTQwMTcgMHgzZGI2NmI0MSAweDZlM2ZmMzhjIDB4OGYzYjlmMTggMHgxNjE2NmY5YSAweDJmNDcyMDY1IDB4ZDVhNzM5YzMgMHg2MWYzYjNlMSAweDU2Y2YzNjhiIDB4OTE5ZmZiZDIgMHhhYWU4YjY5NyAweDg0NzQyMmIxIDB4ZDUyNjAzMjcgMHgxMTRjOGM2ZCAweDM5ZTllNjJhIDB4ZDZhNGMwNWUgMHgxZWY4MTUxYSAweDY2ZGQ3Zjk2IDB4NGQ5ZWNlYjIgMHgxOWJhNzBlZSAvLyBtZXRob2QgInZlcmlmeV9hZGR3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZChieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmFzZTY0X2RlY29kZV91cmwoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2JpdGxlbihieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9iaXRsZW4odWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2JzcXJ0KGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9idG9pKGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9iemVybyh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfY29uY2F0KGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9kaXZtb2R3KHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2RpdncodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXJyKCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhwKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXhwdyh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3QoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF9mcm9tXzIoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2V4dHJhY3RfdWludDE2KGJ5dGVbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZXh0cmFjdF91aW50MzIoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9leHRyYWN0X3VpbnQ2NChieXRlW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldGJpdF9ieXRlcyhieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9nZXRiaXRfdWludDY0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2dldGJ5dGUoYnl0ZVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9pdG9iKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9tdWx3KHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJ2ZXJpZnlfcmVwbGFjZShieXRlW10sdWludDY0LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9zZWxlY3RfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2VsZWN0X3VpbnQ2NCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9zZXRiaXRfYnl0ZXMoYnl0ZVtdLHVpbnQ2NCxib29sKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X3NldGJpdF91aW50NjQodWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3NldGJ5dGUoYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfc2hsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc2hyKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3FydCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfc3Vic3RyaW5nKGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3N0cmluZyhieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX3VpbnQ2NChieXRlW10sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2pzb25fcmVmX29iamVjdChieXRlW10sYnl0ZVtdKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hZGR3IHZlcmlmeV9iYXNlNjRfZGVjb2RlX3N0YW5kYXJkIHZlcmlmeV9iYXNlNjRfZGVjb2RlX3VybCB2ZXJpZnlfYnl0ZXNfYml0bGVuIHZlcmlmeV91aW50NjRfYml0bGVuIHZlcmlmeV9ic3FydCB2ZXJpZnlfYnRvaSB2ZXJpZnlfYnplcm8gdmVyaWZ5X2NvbmNhdCB2ZXJpZnlfZGl2bW9kdyB2ZXJpZnlfZGl2dyBtYWluX3ZlcmlmeV9lcnJfcm91dGVAMTUgdmVyaWZ5X2V4cCB2ZXJpZnlfZXhwdyB2ZXJpZnlfZXh0cmFjdCB2ZXJpZnlfZXh0cmFjdF9mcm9tXzIgdmVyaWZ5X2V4dHJhY3RfdWludDE2IHZlcmlmeV9leHRyYWN0X3VpbnQzMiB2ZXJpZnlfZXh0cmFjdF91aW50NjQgdmVyaWZ5X2dldGJpdF9ieXRlcyB2ZXJpZnlfZ2V0Yml0X3VpbnQ2NCB2ZXJpZnlfZ2V0Ynl0ZSB2ZXJpZnlfaXRvYiB2ZXJpZnlfbXVsdyB2ZXJpZnlfcmVwbGFjZSB2ZXJpZnlfc2VsZWN0X2J5dGVzIHZlcmlmeV9zZWxlY3RfdWludDY0IHZlcmlmeV9zZXRiaXRfYnl0ZXMgdmVyaWZ5X3NldGJpdF91aW50NjQgdmVyaWZ5X3NldGJ5dGUgdmVyaWZ5X3NobCB2ZXJpZnlfc2hyIHZlcmlmeV9zcXJ0IHZlcmlmeV9zdWJzdHJpbmcgdmVyaWZ5X2pzb25fcmVmX3N0cmluZyB2ZXJpZnlfanNvbl9yZWZfdWludDY0IHZlcmlmeV9qc29uX3JlZl9vYmplY3QKICAgIGVycgoKbWFpbl92ZXJpZnlfZXJyX3JvdXRlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANDQ6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYWRkd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hZGR3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIHJlc3VsdCA9IG9wLmFkZHcoYSwgYikKICAgIGFkZHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfc3RhbmRhcmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmFzZTY0X2RlY29kZV9zdGFuZGFyZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyByZXN1bHQgPSBvcC5iYXNlNjRfZGVjb2RlKG9wLkJhc2U2NC5TdGRFbmNvZGluZywgYSkKICAgIGJhc2U2NF9kZWNvZGUgU3RkRW5jb2RpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Jhc2U2NF9kZWNvZGVfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIHJlc3VsdCA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCBhKQogICAgYmFzZTY0X2RlY29kZSBVUkxFbmNvZGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYml0bGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2JpdGxlbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBiemVybwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyMwogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2JpdGxlbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfYml0bGVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToyOAogICAgLy8gcmVzdWx0ID0gb3AuYml0bGVuKGEpCiAgICBiaXRsZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfYnNxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnNxcnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gb3AuYnNxcnQoYV9iaWd1aW50KQogICAgYnNxcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J0b2lbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnRvaToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKGEpCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2J6ZXJvW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J6ZXJvOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NAogICAgLy8gcmVzdWx0ID0gb3AuYnplcm8oYSkKICAgIGJ6ZXJvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2NvbmNhdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9jb25jYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NDkKICAgIC8vIGEgPSBvcC5iemVybyhwYWRfYV9zaXplKSArIGEKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTAKICAgIC8vIGIgPSBvcC5iemVybyhwYWRfYl9zaXplKSArIGIKICAgIHN3YXAKICAgIGJ6ZXJvCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIHJlc3VsdCA9IGEgKyBiCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9kaXZtb2R3W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Rpdm1vZHc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBvcC5kaXZtb2R3KGEsIGIsIGMsIGQpCiAgICBkaXZtb2R3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2Rpdndbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGl2dzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIHJlc3VsdCA9IG9wLmRpdncoYSwgYiwgYykKICAgIGRpdncKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXhwW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4cDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIHJlc3VsdCA9IG9wLmV4cChhLCBiKQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4cHdbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXhwdzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6NzgKICAgIC8vIHJlc3VsdCA9IG9wLmV4cHcoYSwgYikKICAgIGV4cHcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4MwogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCBiLCBjKQogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfZnJvbV8yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfZnJvbV8yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weTo4OAogICAgLy8gcmVzdWx0ID0gb3AuZXh0cmFjdChhLCAyLCAwKQogICAgZXh0cmFjdCA0IDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2V4dHJhY3RfdWludDE2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4dHJhY3RfdWludDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTMKICAgIC8vIHJlc3VsdCA9IG9wLmV4dHJhY3RfdWludDE2KGEsIGIpCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9leHRyYWN0X3VpbnQzMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9leHRyYWN0X3VpbnQzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyByZXN1bHQgPSBvcC5leHRyYWN0X3VpbnQzMihhLCBiKQogICAgZXh0cmFjdF91aW50MzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZXh0cmFjdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZXh0cmFjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgcHVzaGludCA4CiAgICBleHRyYWN0MwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJpdChhLCBiKQogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfZ2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBvcC5nZXRiaXQoYSwgYikKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2dldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMTgKICAgIC8vIHJlc3VsdCA9IG9wLmdldGJ5dGUoYSwgYikKICAgIGdldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjExNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2l0b2Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXRvYjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihhKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfbXVsd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9tdWx3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTI4CiAgICAvLyByZXN1bHQgPSBvcC5tdWx3KGEsIGIpCiAgICBtdWx3CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3JlcGxhY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcmVwbGFjZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMzCiAgICAvLyByZXN1bHQgPSBvcC5yZXBsYWNlKGEsIGIsIGMpCiAgICByZXBsYWNlMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NlbGVjdF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZWxlY3RfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gcmVzdWx0ID0gb3Auc2VsZWN0X2J5dGVzKGEsIGIsIGMpCiAgICBzZWxlY3QKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zZWxlY3RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NlbGVjdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDMKICAgIC8vIHJlc3VsdCA9IG9wLnNlbGVjdF91aW50NjQoYSwgYiwgYykKICAgIHNlbGVjdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NldGJpdF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJpdF9ieXRlcyhhLCBiLCBjKQogICAgc2V0Yml0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2V0Yml0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zZXRiaXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyByZXN1bHQgPSBvcC5zZXRiaXRfdWludDY0KGEsIGIsIGMpCiAgICBzZXRiaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NldGJ5dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2V0Ynl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNTgKICAgIC8vIHJlc3VsdCA9IG9wLnNldGJ5dGUoYSwgYiwgYykKICAgIHNldGJ5dGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLk1pc2NlbGxhbmVvdXNPcHMuY29udHJhY3QuTWlzY2VsbGFuZW91c09wc0NvbnRyYWN0LnZlcmlmeV9zaGxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc2hsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyByZXN1bHQgPSBvcC5zaGwoYSwgYikKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc2hyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3NocjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmVzdWx0ID0gb3Auc2hyKGEsIGIpCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X3NxcnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3FydDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gcmVzdWx0ID0gb3Auc3FydChhKQogICAgc3FydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfc3Vic3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N1YnN0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHJlc3VsdCA9IG9wLnN1YnN0cmluZyhhLCBiLCBjKQogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3N0cmluZyhhLCBiKQogICAganNvbl9yZWYgSlNPTlN0cmluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuTWlzY2VsbGFuZW91c09wcy5jb250cmFjdC5NaXNjZWxsYW5lb3VzT3BzQ29udHJhY3QudmVyaWZ5X2pzb25fcmVmX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9qc29uX3JlZl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gcmVzdWx0ID0gb3AuSnNvblJlZi5qc29uX3VpbnQ2NChhLCBiKQogICAganNvbl9yZWYgSlNPTlVpbnQ2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5NaXNjZWxsYW5lb3VzT3BzLmNvbnRyYWN0Lk1pc2NlbGxhbmVvdXNPcHNDb250cmFjdC52ZXJpZnlfanNvbl9yZWZfb2JqZWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2pzb25fcmVmX29iamVjdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9NaXNjZWxsYW5lb3VzT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL01pc2NlbGxhbmVvdXNPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyByZXN1bHQgPSBvcC5Kc29uUmVmLmpzb25fb2JqZWN0KGEsIGIpCiAgICBqc29uX3JlZiBKU09OT2JqZWN0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvTWlzY2VsbGFuZW91c09wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAwAIAA2AEwAYQBtAIIAkACcAMIA5wABAPsBCwEfATwBUAFiAXQBhwGdAbEBwwHVAekCCAInAjsCWQJuAosCmwKrArcC1ALwAwUAADEZFDEYFBBEIkM2GgEXNhoCFx5MFkwWUChMULAiQzYaAVcCAF4BSRUWVwYCTFAoTFCwIkM2GgFXAgBeAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUJMWKExQsCJDNhoBF5MWKExQsCJDNhoBVwIAlkkVFlcGAkxQKExQsCJDNhoBVwIAFxYoTFCwIkM2GgEXrwEpTFCwIkM2GgFXAgA2GgJXAgA2GgMXNhoEF0yvTwNQTK9PAlBQASlMULAiQzYaARc2GgIXNhoDFzYaBBcfTwMWTwMWUE8CFlBMFlAoTFCwIkM2GgEXNhoCFzYaAxeXFihMULAiQzYaARc2GgIXlBYoTFCwIkM2GgEXNhoCF5VMFkwWUChMULAiQzYaAVcCADYaAhc2GgMXWEkVFlcGAkxQKExQsCJDNhoBVwQASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXWRYoTFCwIkM2GgFXAgA2GgIXWhYoTFCwIkM2GgFXAgA2GgIXgQhYKExQsCJDNhoBVwIANhoCF1MqI08CVChMULAiQzYaARc2GgIXUyojTwJUKExQsCJDNhoBVwIANhoCF1UWKExQsCJDNhoBFxaABhUffHUACExQsCJDNhoBFzYaAhcdTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDVwIAXUkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIANhoDF01JFRZXBgJMUChMULAiQzYaARc2GgIXNhoDF00WKExQsCJDNhoBVwIANhoCFzYaAyNTVEkVFlcGAkxQKExQsCJDNhoBFzYaAhc2GgMjU1QWKExQsCJDNhoBVwIANhoCFzYaAxdWSRUWVwYCTFAoTFCwIkM2GgEXNhoCF5AWKExQsCJDNhoBFzYaAheRFihMULAiQzYaAReSFihMULAiQzYaAVcCADYaAhc2GgMXUkkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAXwBJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8BFihMULAiQzYaAVcCADYaAlcCAF8CSRUWVwYCTFAoTFCwIkM=", + "approval": "CyACAQAmAwQVH3x1BhUffHUAIAEAMRtBARMxGRREMRhEgiUERYR+6gT1es61BH1jFzAEobJEQQTNe+GsBHz9pksEVKkQ2QTEZWjeBHpGpq4EBDciCQR+X21yBCTrz4QEnAszlwQK1A2kBJUXiHAE3u3JmwSrIVC7BAKlQBcEPbZrQQRuP/OMBI87nxgEFhZvmgQvRyBlBNWnOcMEYfOz4QRWzzaLBJGf+9IEqui2lwSEdCKxBNUmAycEEUyMbQQ56eYqBNakwF4EHvgVGgRm3X+WBE2ezrIEGbpw7jYaAI4lAAoAHgA0AEoAXwBrAIAAjgCaAMAA5QABAPkBCQEdAToBTgFgAXIBhQGbAa8BwQHTAecCBgIlAjkCVwJsAokCmQKpArUC0gLuAwMAADEZFDEYFBBDNhoBFzYaAhceTBZMFlAoTFCwIkM2GgFXAgBeAUkVFlcGAkxQKExQsCJDNhoBVwIAXgBJFRZXBgJMUChMULAiQzYaAVcCADYaAhevTFCTFihMULAiQzYaAReTFihMULAiQzYaAVcCAJZJFRZXBgJMUChMULAiQzYaAVcCABcWKExQsCJDNhoBF68BKUxQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAEpTFCwIkM2GgEXNhoCFzYaAxc2GgQXH08DFk8DFlBPAhZQTBZQKExQsCJDNhoBFzYaAhc2GgMXlxYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAheVTBZMFlAoTFCwIkM2GgFXAgA2GgIXNhoDF1hJFRZXBgJMUChMULAiQzYaAVcEAEkVFlcGAkxQKExQsCJDNhoBVwIANhoCF1kWKExQsCJDNhoBVwIANhoCF1oWKExQsCJDNhoBVwIANhoCF4EIWChMULAiQzYaAVcCADYaAhdTKiNPAlQoTFCwIkM2GgEXNhoCF1MqI08CVChMULAiQzYaAVcCADYaAhdVFihMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaARc2GgIXHUwWTBZQKExQsCJDNhoBVwIANhoCFzYaA1cCAF1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCADYaAxdNSRUWVwYCTFAoTFCwIkM2GgEXNhoCFzYaAxdNFihMULAiQzYaAVcCADYaAhc2GgMjU1RJFRZXBgJMUChMULAiQzYaARc2GgIXNhoDI1NUFihMULAiQzYaAVcCADYaAhc2GgMXVkkVFlcGAkxQKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXkhYoTFCwIkM2GgFXAgA2GgIXNhoDF1JJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAF8ASRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgBfARYoTFCwIkM2GgFXAgA2GgJXAgBfAkkVFlcGAkxQKExQsCJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal +++ b/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal index e54acc18..b2be54d7 100644 --- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@67 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x725c692b 0x17314559 0x53f34893 0x88c8b269 0xa464b7ab 0x9c8b11b8 0x6f40654e 0xec9a2974 0xc793708f 0x7ddb7499 0xa21c443d 0x6e7fb212 0xb007fcb0 0x2ebc20d4 0xb0954b66 0xdd140aef 0xace474da 0xba694990 0x6db581c0 0x91c8db89 0xdbe77158 0x9a0f22e1 0x64033d37 0x2a7237c5 0xe3a94458 0x42f87f7d 0x2b5542a4 0x9be2fbe9 0x1cd92515 0x64e1705c 0xf1271c50 0x2ab63b70 0x834bb7d2 0x531620d7 0x3fb9e769 0xfa8db0bc 0xa72ea485 0xb7b0ba19 0x74460c42 0xab320738 0x52ad4654 0x10156399 0x0f075957 0xbd843dff 0xb377d381 0x89767265 0x456b4b23 0x33d1b88c 0x6bf973ea 0x67cd6bb2 0x3f58805a 0x1e130039 0x509dc91d 0xa564a202 0x23650763 0xf8c8f8d5 0x23faf7a4 0x7d0afe15 0x48581adf 0xe007c10b // method "verify_uint64_init(byte[])uint64", method "verify_uint64_add(uint64,uint64)uint64", method "verify_uint64_sub(uint64,uint64)uint64", method "verify_uint64_mul(uint64,uint64)uint64", method "verify_uint64_div(uint64,uint64)uint64", method "verify_uint64_mod(uint64,uint64)uint64", method "verify_uint64_and(uint64,uint64)uint64", method "verify_uint64_or(uint64,uint64)uint64", method "verify_uint64_xor(uint64,uint64)uint64", method "verify_uint64_not(uint64)uint64", method "verify_uint64_lshift(uint64,uint64)uint64", method "verify_uint64_rshift(uint64,uint64)uint64", method "verify_uint64_pow(uint64,uint64)uint64", method "verify_uint64_eq(uint64,uint64)bool", method "verify_uint64_ne(uint64,uint64)bool", method "verify_uint64_lt(uint64,uint64)bool", method "verify_uint64_le(uint64,uint64)bool", method "verify_uint64_gt(uint64,uint64)bool", method "verify_uint64_ge(uint64,uint64)bool", method "verify_bytes_init(uint64)byte[]", method "verify_bytes_add(byte[],byte[],uint64,uint64)byte[]", method "verify_bytes_eq(byte[],byte[])bool", method "verify_bytes_ne(byte[],byte[])bool", method "verify_bytes_and(byte[],byte[])byte[]", method "verify_bytes_or(byte[],byte[])byte[]", method "verify_bytes_xor(byte[],byte[])byte[]", method "verify_bytes_not(byte[],uint64)byte[]", method "verify_biguint_add(byte[],byte[])byte[]", method "verify_biguint_add_uint64(byte[],uint64)byte[]", method "verify_biguint_sub(byte[],byte[])byte[]", method "verify_biguint_sub_uint64(byte[],uint64)byte[]", method "verify_biguint_mul(byte[],byte[])byte[]", method "verify_biguint_mul_uint64(byte[],uint64)byte[]", method "verify_biguint_div(byte[],byte[])byte[]", method "verify_biguint_div_uint64(byte[],uint64)byte[]", method "verify_biguint_mod(byte[],byte[])byte[]", method "verify_biguint_mod_uint64(byte[],uint64)byte[]", method "verify_biguint_and(byte[],byte[])byte[]", method "verify_biguint_and_uint64(byte[],uint64)byte[]", method "verify_biguint_or(byte[],byte[])byte[]", method "verify_biguint_or_uint64(byte[],uint64)byte[]", method "verify_biguint_xor(byte[],byte[])byte[]", method "verify_biguint_xor_uint64(byte[],uint64)byte[]", method "verify_biguint_eq(byte[],byte[])bool", method "verify_biguint_eq_uint64(byte[],uint64)bool", method "verify_biguint_ne(byte[],byte[])bool", method "verify_biguint_ne_uint64(byte[],uint64)bool", method "verify_biguint_lt(byte[],byte[])bool", method "verify_biguint_lt_uint64(byte[],uint64)bool", method "verify_biguint_le(byte[],byte[])bool", method "verify_biguint_le_uint64(byte[],uint64)bool", method "verify_biguint_gt(byte[],byte[])bool", method "verify_biguint_gt_uint64(byte[],uint64)bool", method "verify_biguint_ge(byte[],byte[])bool", method "verify_biguint_ge_uint64(byte[],uint64)bool", method "verify_string_init(string)string", method "verify_string_startswith(string,string)bool", method "verify_string_endswith(string,string)bool", method "verify_string_join(string,string)string", method "verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[])void" @@ -25,8 +25,6 @@ main___algopy_default_create@67: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json index 70a0524e..d39518dd 100644 --- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json +++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json @@ -1574,20 +1574,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 31 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 470 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -1596,19 +1583,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NzI1YzY5MmIgMHgxNzMxNDU1OSAweDUzZjM0ODkzIDB4ODhjOGIyNjkgMHhhNDY0YjdhYiAweDljOGIxMWI4IDB4NmY0MDY1NGUgMHhlYzlhMjk3NCAweGM3OTM3MDhmIDB4N2RkYjc0OTkgMHhhMjFjNDQzZCAweDZlN2ZiMjEyIDB4YjAwN2ZjYjAgMHgyZWJjMjBkNCAweGIwOTU0YjY2IDB4ZGQxNDBhZWYgMHhhY2U0NzRkYSAweGJhNjk0OTkwIDB4NmRiNTgxYzAgMHg5MWM4ZGI4OSAweGRiZTc3MTU4IDB4OWEwZjIyZTEgMHg2NDAzM2QzNyAweDJhNzIzN2M1IDB4ZTNhOTQ0NTggMHg0MmY4N2Y3ZCAweDJiNTU0MmE0IDB4OWJlMmZiZTkgMHgxY2Q5MjUxNSAweDY0ZTE3MDVjIDB4ZjEyNzFjNTAgMHgyYWI2M2I3MCAweDgzNGJiN2QyIDB4NTMxNjIwZDcgMHgzZmI5ZTc2OSAweGZhOGRiMGJjIDB4YTcyZWE0ODUgMHhiN2IwYmExOSAweDc0NDYwYzQyIDB4YWIzMjA3MzggMHg1MmFkNDY1NCAweDEwMTU2Mzk5IDB4MGYwNzU5NTcgMHhiZDg0M2RmZiAweGIzNzdkMzgxIDB4ODk3NjcyNjUgMHg0NTZiNGIyMyAweDMzZDFiODhjIDB4NmJmOTczZWEgMHg2N2NkNmJiMiAweDNmNTg4MDVhIDB4MWUxMzAwMzkgMHg1MDlkYzkxZCAweGE1NjRhMjAyIDB4MjM2NTA3NjMgMHhmOGM4ZjhkNSAweDIzZmFmN2E0IDB4N2QwYWZlMTUgMHg0ODU4MWFkZiAweGUwMDdjMTBiIC8vIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9pbml0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYWRkKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3N1Yih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tdWwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZGl2KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X21vZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9hbmQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfb3IodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfeG9yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X25vdCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2xzaGlmdCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9yc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcG93KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2VxKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9uZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbHQodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2xlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ndCh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ2UodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfaW5pdCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYWRkKGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19vcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX25vdChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hZGRfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWIoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2KGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9kaXZfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2QoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X21vZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF94b3JfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sdF91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9nZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2luaXQoc3RyaW5nKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoKHN0cmluZyxzdHJpbmcpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19lbmRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfam9pbihzdHJpbmcsc3RyaW5nKXN0cmluZyIsIG1ldGhvZCAidmVyaWZ5X2xvZyhzdHJpbmcsdWludDY0LGJ5dGVbXSxieXRlW10sYm9vbCxzdHJpbmcsdWludDY0LHVpbnQyNTYsdWZpeGVkMzJ4OCx1Zml4ZWQyNTZ4MTYsYnl0ZVtdLGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2kocmF3X3ZhbHVlKQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfc3ViW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gcmVzdWx0ID0gYSAtIGIKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIHJlc3VsdCA9IGEgKiBiCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXN1bHQgPSBhIC8vIGIKICAgIC8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIHJlc3VsdCA9IGEgJSBiCiAgICAlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICB8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBhIF4gYgogICAgXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NAogICAgLy8gcmVzdWx0ID0gfmEKICAgIH4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbHNoaWZ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IGEgPDwgYgogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3JzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXN1bHQgPSBhID4+IGIKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9wb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gcmVzdWx0ID0gYSoqYgogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIHJlc3VsdCA9IGEgPCBiCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJlc3VsdCA9IGEgPD0gYgogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NAogICAgLy8gcmVzdWx0ID0gYSA+IGIKICAgID4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gcmVzdWx0ID0gYSA+PSBiCiAgICA+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihyYXdfdmFsdWUpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEyCiAgICAvLyBiID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkgKyBiCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXN1bHQgPSBhID09IGIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHJlc3VsdCA9IGEgIT0gYgogICAgIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19vcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gcmVzdWx0ID0gYSB8IGIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIHJlc3VsdCA9IH5hCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDYKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBiKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYgogICAgaXRvYgogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1YjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBiLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYgogICAgaXRvYgogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBiKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYgogICAgaXRvYgogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC8vIGJfYmlndWludAogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiCiAgICBpdG9iCiAgICBiLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiX2JpZ3VpbnQKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tb2RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiCiAgICBpdG9iCiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiX2JpZ3VpbnQKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hbmRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiCiAgICBpdG9iCiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzcKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGIKICAgIGl0b2IKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgYl4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGIKICAgIGl0b2IKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYl9iaWd1aW50CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYgogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYl9iaWd1aW50CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYgogICAgaXRvYgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPCBiX2JpZ3VpbnQKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYgogICAgaXRvYgogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiCiAgICBpdG9iCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiCiAgICBpdG9iCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGJfYmlndWludAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGIKICAgIGl0b2IKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMzCiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIkhlbGxvLCAiKSArIGEKICAgIHB1c2hieXRlcyAiSGVsbG8sICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPgogICAgYnogdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgPT0KICAgIGIgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19lbmRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZW5kc3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgZGlnIDMKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0CgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2pvaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2pvaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ4CiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIiwgIikuam9pbigoYSwgYikpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiwgIgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gbG9nKGEsIGIsIGMsIGRfYmlndWludCwgZSwgZiwgZywgaCwgaSwgaiwgYXJjNF9rLCBhcmM0X20sIGFyYzRfbiwgc2VwPSItIikKICAgIHVuY292ZXIgMTIKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHhlMDA3YzEwYiAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludDY0X2luaXQgdmVyaWZ5X3VpbnQ2NF9hZGQgdmVyaWZ5X3VpbnQ2NF9zdWIgdmVyaWZ5X3VpbnQ2NF9tdWwgdmVyaWZ5X3VpbnQ2NF9kaXYgdmVyaWZ5X3VpbnQ2NF9tb2QgdmVyaWZ5X3VpbnQ2NF9hbmQgdmVyaWZ5X3VpbnQ2NF9vciB2ZXJpZnlfdWludDY0X3hvciB2ZXJpZnlfdWludDY0X25vdCB2ZXJpZnlfdWludDY0X2xzaGlmdCB2ZXJpZnlfdWludDY0X3JzaGlmdCB2ZXJpZnlfdWludDY0X3BvdyB2ZXJpZnlfdWludDY0X2VxIHZlcmlmeV91aW50NjRfbmUgdmVyaWZ5X3VpbnQ2NF9sdCB2ZXJpZnlfdWludDY0X2xlIHZlcmlmeV91aW50NjRfZ3QgdmVyaWZ5X3VpbnQ2NF9nZSB2ZXJpZnlfYnl0ZXNfaW5pdCB2ZXJpZnlfYnl0ZXNfYWRkIHZlcmlmeV9ieXRlc19lcSB2ZXJpZnlfYnl0ZXNfbmUgdmVyaWZ5X2J5dGVzX2FuZCB2ZXJpZnlfYnl0ZXNfb3IgdmVyaWZ5X2J5dGVzX3hvciB2ZXJpZnlfYnl0ZXNfbm90IHZlcmlmeV9iaWd1aW50X2FkZCB2ZXJpZnlfYmlndWludF9hZGRfdWludDY0IHZlcmlmeV9iaWd1aW50X3N1YiB2ZXJpZnlfYmlndWludF9zdWJfdWludDY0IHZlcmlmeV9iaWd1aW50X211bCB2ZXJpZnlfYmlndWludF9tdWxfdWludDY0IHZlcmlmeV9iaWd1aW50X2RpdiB2ZXJpZnlfYmlndWludF9kaXZfdWludDY0IHZlcmlmeV9iaWd1aW50X21vZCB2ZXJpZnlfYmlndWludF9tb2RfdWludDY0IHZlcmlmeV9iaWd1aW50X2FuZCB2ZXJpZnlfYmlndWludF9hbmRfdWludDY0IHZlcmlmeV9iaWd1aW50X29yIHZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NCB2ZXJpZnlfYmlndWludF94b3IgdmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9lcSB2ZXJpZnlfYmlndWludF9lcV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbmUgdmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0IHZlcmlmeV9iaWd1aW50X2x0IHZlcmlmeV9iaWd1aW50X2x0X3VpbnQ2NCB2ZXJpZnlfYmlndWludF9sZSB2ZXJpZnlfYmlndWludF9sZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ3QgdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0IHZlcmlmeV9iaWd1aW50X2dlIHZlcmlmeV9iaWd1aW50X2dlX3VpbnQ2NCB2ZXJpZnlfc3RyaW5nX2luaXQgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGggdmVyaWZ5X3N0cmluZ19qb2luIHZlcmlmeV9sb2cKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA2NzoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKHJhd192YWx1ZSkKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYWRkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfc3ViOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkKICAgIC8vIHJlc3VsdCA9IGEgLSBiCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9tdWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyByZXN1bHQgPSBhICogYgogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZGl2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9kaXY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmVzdWx0ID0gYSAvLyBiCiAgICAvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9tb2Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X21vZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSBhICUgYgogICAgJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9hbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozOQogICAgLy8gcmVzdWx0ID0gYSAmIGIKICAgICYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X29yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHQgPSBhIHwgYgogICAgfAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0OQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIF4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25vdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbm90OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTQKICAgIC8vIHJlc3VsdCA9IH5hCiAgICB+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9sc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBhIDw8IGIKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcnNoaWZ0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9yc2hpZnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gcmVzdWx0ID0gYSA+PiBiCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X3Bvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfcG93OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIHJlc3VsdCA9IGEqKmIKICAgIGV4cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzQKICAgIC8vIHJlc3VsdCA9IGEgPT0gYgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gcmVzdWx0ID0gYSAhPSBiCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyByZXN1bHQgPSBhIDwgYgogICAgPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyByZXN1bHQgPSBhIDw9IGIKICAgIDw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTQKICAgIC8vIHJlc3VsdCA9IGEgPiBiCiAgICA+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2dlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTkKICAgIC8vIHJlc3VsdCA9IGEgPj0gYgogICAgPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDQKICAgIC8vIHJlc3VsdCA9IG9wLml0b2IocmF3X3ZhbHVlKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYWRkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpICsgYQogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYiA9IG9wLmJ6ZXJvKHBhZF9iX3NpemUpICsgYgogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTQKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gcmVzdWx0ID0gYSAmIGIKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfb3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX3hvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc194b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHJlc3VsdCA9IGEgXiBiCiAgICBiXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX25vdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ1CiAgICAvLyByZXN1bHQgPSB+YQogICAgYn4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ2CiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCArIGJfYmlndWludAogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9hZGRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCArIGIKICAgIGl0b2IKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9zdWJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAtIGJfYmlndWludAogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9zdWJfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAtIGIKICAgIGl0b2IKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tdWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9tdWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAqIGJfYmlndWludAogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9tdWxfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAqIGIKICAgIGl0b2IKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiX2JpZ3VpbnQKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9kaXZfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgLy8gYgogICAgaXRvYgogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X21vZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwNQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICUgYl9iaWd1aW50CiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICUgYgogICAgaXRvYgogICAgYiUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICYgYl9iaWd1aW50CiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICYgYgogICAgaXRvYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGJfYmlndWludAogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgfCBiCiAgICBpdG9iCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfeG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgXiBiX2JpZ3VpbnQKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgXiBiCiAgICBpdG9iCiAgICBiXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID09IGJfYmlndWludAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9lcV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID09IGIKICAgIGl0b2IKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICE9IGJfYmlndWludAogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9uZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICE9IGIKICAgIGl0b2IKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYl9iaWd1aW50CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8IGIKICAgIGl0b2IKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPD0gYl9iaWd1aW50CiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzAyCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPD0gYgogICAgaXRvYgogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiX2JpZ3VpbnQKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9ndF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9ndF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID4gYgogICAgaXRvYgogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2dlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+PSBiCiAgICBpdG9iCiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gcmVzdWx0ID0gU3RyaW5nKCJIZWxsbywgIikgKyBhCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGhbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmVzdWx0ID0gYS5zdGFydHN3aXRoKGIpCiAgICBsZW4KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDMKICAgIGludGNfMSAvLyAwCgp2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGhfdGVybmFyeV9tZXJnZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmVzdWx0ID0gYS5zdGFydHN3aXRoKGIpCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDIKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQKCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZW5kc3dpdGhbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VuZHN3aXRoOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDMKICAgIC8vIHJlc3VsdCA9IGEuZW5kc3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+CiAgICBieiB2ZXJpZnlfc3RyaW5nX2VuZHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDMKICAgIC8vIHJlc3VsdCA9IGEuZW5kc3dpdGgoYikKICAgIGR1cAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgLQogICAgZGlnIDUKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdDMKICAgIGRpZyAzCiAgICA9PQogICAgYiB2ZXJpZnlfc3RyaW5nX2VuZHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19qb2luW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19qb2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gcmVzdWx0ID0gU3RyaW5nKCIsICIpLmpvaW4oKGEsIGIpKQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIsICIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEyCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8E4AfBCzYaAI48AAsAGQApADkASQBZAGkAeQCJAJkApQC1AMUA1QDpAP0BEQElATkBTQFfAYUBnQG1AdAB6wIGAhsCNgJQAmsChQKgAroC1QLvAwoDJAM/A1kDdAOOA6kDwwPbA/IECgQhBDkEUARoBH8ElwSuBMYE3QT8BS0FaAWKADEZFDEYFBBEIkM2GgFXAgAXFihMULAiQzYaARc2GgIXCBYoTFCwIkM2GgEXNhoCFwkWKExQsCJDNhoBFzYaAhcLFihMULAiQzYaARc2GgIXChYoTFCwIkM2GgEXNhoCFxgWKExQsCJDNhoBFzYaAhcaFihMULAiQzYaARc2GgIXGRYoTFCwIkM2GgEXNhoCFxsWKExQsCJDNhoBFxwWKExQsCJDNhoBFzYaAheQFihMULAiQzYaARc2GgIXkRYoTFCwIkM2GgEXNhoCF5QWKExQsCJDNhoBFzYaAhcSKSNPAlQoTFCwIkM2GgEXNhoCFxMpI08CVChMULAiQzYaARc2GgIXDCkjTwJUKExQsCJDNhoBFzYaAhcOKSNPAlQoTFCwIkM2GgEXNhoCFw0pI08CVChMULAiQzYaARc2GgIXDykjTwJUKExQsCJDNhoBFxaABhUffHUACExQsCJDNhoBVwIANhoCVwIANhoDFzYaBBdMr08DUEyvTwJQUAErTFCwIkM2GgFXAgA2GgJXAgASKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgATKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCsSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCrSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXr0xQrgErTFCwIkM2GgFXAgA2GgJXAgCgSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqBJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKFJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWoUkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxajSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqJJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKpJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWqkkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxasSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCrSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqtJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAK1JFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrUkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAqCkjTwJUKExQsCJDNhoBVwIANhoCFxaoKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCpKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqkpI08CVChMULAiQzYaAVcCADYaAlcCAKQpI08CVChMULAiQzYaAVcCADYaAhcWpCkjTwJUKExQsCJDNhoBVwIANhoCVwIApikjTwJUKExQsCJDNhoBVwIANhoCFxamKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgClKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqUpI08CVChMULAiQzYaAVcCADYaAlcCAKcpI08CVChMULAiQzYaAVcCADYaAhcWpykjTwJUKExQsCJDNhoBVwIAgAdIZWxsbywgTFBJFRZXBgJMUChMULAiQzYaAVcCAEk2GgJXAgBJTgIVSU8CFQ1BAAwjKSNPAlQoTFCwIkNLAiNLAlhLAhJC/+k2GgFXAgBJNhoCVwIASU4CFUlPAhVJTgINQQAMIykjTwJUKExQsCJDSUsCSU4CCUsFTE8CWEsDEkL/4jYaAVcCADYaAlcCAEyAAiwgUExQSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXNhoDVwIANhoEVwIANhoFNhoGNhoHNhoINhoJNhoKNhoLVwIANhoMVwIANhoNVwIATwwqUE8MFlAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=", + "approval": "CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8E4AfBCzYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCAE8MKlBPDBZQKlBPC1AqUE8KUCpQTwlQKlBPCFAqUE8HUCpQTwZQKlBPBVAqUE8EUCpQTwNQKlBPAlAqUExQsCJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal +++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateMutations/data/StateMutations.approval.teal b/tests/artifacts/StateMutations/data/StateMutations.approval.teal index be0a1cf9..bbec1415 100644 --- a/tests/artifacts/StateMutations/data/StateMutations.approval.teal +++ b/tests/artifacts/StateMutations/data/StateMutations.approval.teal @@ -20,7 +20,7 @@ main_after_if_else@2: bz main_bare_routing@12 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x526e8bbf 0x95fef13d 0x0c29444b // method "append()void", method "modify()void", method "get()(uint64,string)[]" @@ -39,7 +39,7 @@ main_opt_in@14: // tests/artifacts/StateMutations/statemutations.py:31 // @arc4.baremethod(allow_actions=["OptIn"]) txn ApplicationID - assert // can only call when not creating + assert // tests/artifacts/StateMutations/statemutations.py:33 // self.glob_assign.value = MyArray() bytec_3 // "glob_assign" @@ -98,8 +98,6 @@ main_opt_in@14: main___algopy_default_create@13: txn ApplicationID ! - assert // can only call when creating - intc_1 // 1 return diff --git a/tests/artifacts/StateMutations/data/StateMutations.arc56.json b/tests/artifacts/StateMutations/data/StateMutations.arc56.json index f718795e..fb58f38d 100644 --- a/tests/artifacts/StateMutations/data/StateMutations.arc56.json +++ b/tests/artifacts/StateMutations/data/StateMutations.arc56.json @@ -125,125 +125,107 @@ "sourceInfo": [ { "pc": [ - 95 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 174 - ], - "errorMessage": "can only call when creating" - }, - { - "pc": [ - 139 - ], - "errorMessage": "can only call when not creating" - }, - { - "pc": [ - 528, - 797, - 933 + 526, + 795, + 931 ], "errorMessage": "check self.box exists" }, { "pc": [ - 483, - 686, - 923 + 481, + 684, + 921 ], "errorMessage": "check self.glob exists" }, { "pc": [ - 442, - 579, - 918 + 440, + 577, + 916 ], "errorMessage": "check self.glob_assign exists" }, { "pc": [ - 508, - 744, - 930 + 506, + 742, + 928 ], "errorMessage": "check self.loc exists for account" }, { "pc": [ - 555, - 857, - 940 + 553, + 855, + 938 ], "errorMessage": "check self.map entry exists" }, { "pc": [ - 462, - 632, - 914 + 460, + 630, + 912 ], "errorMessage": "check self.no_proxy exists" }, { "pc": [ - 964 + 962 ], "errorMessage": "expected box == no_proxy" }, { "pc": [ - 952 + 950 ], "errorMessage": "expected global == no_proxy" }, { "pc": [ - 946 + 944 ], "errorMessage": "expected global assign == no_proxy" }, { "pc": [ - 958 + 956 ], "errorMessage": "expected local == no_proxy" }, { "pc": [ - 968 + 966 ], "errorMessage": "expected map == no_proxy" }, { "pc": [ - 595, - 621, - 648, - 674, - 702, - 728, - 760, - 786, - 813, - 839, - 873, - 899 + 593, + 619, + 646, + 672, + 700, + 726, + 758, + 784, + 811, + 837, + 871, + 897 ], "errorMessage": "index access is out of bounds" }, { "pc": [ - 587, - 640, - 694, - 752, - 805, - 865 + 585, + 638, + 692, + 750, + 803, + 863 ], "errorMessage": "invalid array length header" } @@ -256,19 +238,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1MjZlOGJiZiAweDk1ZmVmMTNkIDB4MGMyOTQ0NGIgLy8gbWV0aG9kICJhcHBlbmQoKXZvaWQiLCBtZXRob2QgIm1vZGlmeSgpdm9pZCIsIG1ldGhvZCAiZ2V0KCkodWludDY0LHN0cmluZylbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFwcGVuZCBtb2RpZnkgZ2V0CiAgICBlcnIKCm1haW5fYmFyZV9yb3V0aW5nQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjIyCiAgICAvLyBjbGFzcyBTdGF0ZU11dGF0aW9ucyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTMgbWFpbl9vcHRfaW5AMTQKICAgIGVycgoKbWFpbl9vcHRfaW5AMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzEKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNAogICAgLy8gc2VsZi5nbG9iLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzUKICAgIC8vIHNlbGYuYm94LnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJ5dGVjIDggLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMwogICAgLy8gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNwogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozMQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTM6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZGlnIDIKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDUKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGRpZyA0CiAgICAtCiAgICBjb3ZlciA2CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgY292ZXIgNgogICAgZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDUKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBzd2FwCgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMjoKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAyCgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA1OgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlTXV0YXRpb25zLnN0YXRlbXV0YXRpb25zLlN0YXRlTXV0YXRpb25zLmFwcGVuZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MgogICAgLy8gYXJyID0gc2VsZi5nbG9iX2Fzc2lnbi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iX2Fzc2lnbiBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDUKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBhcnIuY29weSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDYKICAgIC8vIHNlbGYubm9fcHJveHkuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDYKICAgIC8vIHNlbGYubm9fcHJveHkuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ3CiAgICAvLyBzZWxmLmdsb2IudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ3CiAgICAvLyBzZWxmLmdsb2IudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDgKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDkKICAgIC8vIHNlbGYuYm94LnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjUwCiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5tb2RpZnlbcm91dGluZ10oKSAtPiB2b2lkOgptb2RpZnk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTYKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTcKICAgIC8vIGFyclswXS5iYXogPSBtb2RpZmllZAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTgKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBhcnIuY29weSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MAogICAgLy8gc2VsZi5ub19wcm94eVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYxCiAgICAvLyBzZWxmLmdsb2IudmFsdWVbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MgogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjMKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjMKICAgIC8vIHNlbGYuYm94LnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjQKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlTXV0YXRpb25zLnN0YXRlbXV0YXRpb25zLlN0YXRlTXV0YXRpb25zLmdldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OAogICAgLy8gYTAgPSBzZWxmLm5vX3Byb3h5LmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY5CiAgICAvLyBhMSA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzAKICAgIC8vIGEyID0gc2VsZi5nbG9iLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3MQogICAgLy8gYTMgPSBzZWxmLmxvY1tUeG4uc2VuZGVyXS5jb3B5KCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzIKICAgIC8vIGE0ID0gc2VsZi5ib3gudmFsdWUuY29weSgpCiAgICBieXRlY18wIC8vICJib3giCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3ggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzMKICAgIC8vIGE1ID0gc2VsZi5tYXBbVHhuLnNlbmRlcl0uY29weSgpCiAgICBieXRlYyA4IC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NQogICAgLy8gYXNzZXJ0IGEwID09IGExLCAiZXhwZWN0ZWQgZ2xvYmFsIGFzc2lnbiA9PSBub19wcm94eSIKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZ2xvYmFsIGFzc2lnbiA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5Ojc2CiAgICAvLyBhc3NlcnQgYTAgPT0gYTIsICJleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgNAogICAgdW5jb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5Ojc3CiAgICAvLyBhc3NlcnQgYTAgPT0gYTMsICJleHBlY3RlZCBsb2NhbCA9PSBub19wcm94eSIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3OAogICAgLy8gYXNzZXJ0IGEwID09IGE0LCAiZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5IgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBib3ggPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3OQogICAgLy8gYXNzZXJ0IGEwID09IGE1LCAiZXhwZWN0ZWQgbWFwID09IG5vX3Byb3h5IgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgbWFwID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMiA4CiAgICBieXRlY2Jsb2NrICJib3giICJub19wcm94eSIgMHgwMDAwICJnbG9iX2Fzc2lnbiIgImdsb2IiICJsb2MiIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YSAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0ICJtYXAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MjQKICAgIC8vIHNlbGYubm9fcHJveHkgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYnl0ZWNfMiAvLyAweDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NTI2ZThiYmYgMHg5NWZlZjEzZCAweDBjMjk0NDRiIC8vIG1ldGhvZCAiYXBwZW5kKCl2b2lkIiwgbWV0aG9kICJtb2RpZnkoKXZvaWQiLCBtZXRob2QgImdldCgpKHVpbnQ2NCxzdHJpbmcpW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhcHBlbmQgbW9kaWZ5IGdldAogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weToyMgogICAgLy8gY2xhc3MgU3RhdGVNdXRhdGlvbnMoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDEzIG1haW5fb3B0X2luQDE0CiAgICBlcnIKCm1haW5fb3B0X2luQDE0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18zIC8vICJnbG9iX2Fzc2lnbiIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM0CiAgICAvLyBzZWxmLmdsb2IudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzMKICAgIC8vIHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6MzQKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTozNQogICAgLy8gc2VsZi5ib3gudmFsdWUgPSBNeUFycmF5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM1CiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM2CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMzCiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gTXlBcnJheSgpCiAgICBieXRlY18yIC8vIDB4MDAwMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM3CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjMxCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxMzoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkaWcgMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA1CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgNAogICAgLQogICAgY292ZXIgNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGNvdmVyIDYKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA1CiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgc3dhcAoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMgogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5hcHBlbmRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDIKICAgIC8vIGFyciA9IHNlbGYuZ2xvYl9hc3NpZ24udmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYl9hc3NpZ24gZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NDMKICAgIC8vIGFyci5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGJ5dGVjIDYgLy8gMHgwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMGEwMDAzNjI2MTdhCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ1CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vX3Byb3h5IGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQzCiAgICAvLyBhcnIuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBieXRlYyA2IC8vIDB4MDAwMjAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ2CiAgICAvLyBzZWxmLm5vX3Byb3h5LmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gIm5vX3Byb3h5IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0NwogICAgLy8gc2VsZi5nbG9iLnZhbHVlLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ4CiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OAogICAgLy8gc2VsZi5sb2NbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjQ5CiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0OQogICAgLy8gc2VsZi5ib3gudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTAKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo0MwogICAgLy8gYXJyLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWMgNiAvLyAweDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwYTAwMDM2MjYxN2EKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1MAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0uYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVNdXRhdGlvbnMuc3RhdGVtdXRhdGlvbnMuU3RhdGVNdXRhdGlvbnMubW9kaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU2CiAgICAvLyBhcnIgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU3CiAgICAvLyBhcnJbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NwogICAgLy8gYXJyWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU4CiAgICAvLyBzZWxmLmdsb2JfYXNzaWduLnZhbHVlID0gYXJyLmNvcHkoKQogICAgYnl0ZWNfMyAvLyAiZ2xvYl9hc3NpZ24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYwCiAgICAvLyBzZWxmLm5vX3Byb3h5WzBdLmJheiA9IG1vZGlmaWVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibm9fcHJveHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9fcHJveHkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjAKICAgIC8vIHNlbGYubm9fcHJveHlbMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdsb2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYiBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2MQogICAgLy8gc2VsZi5nbG9iLnZhbHVlWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNCAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo1NAogICAgLy8gbW9kaWZpZWQgPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWMgNyAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjIKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IG1vZGlmaWVkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTQKICAgIC8vIG1vZGlmaWVkID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGJ5dGVjIDcgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjYzCiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBtb2RpZmllZAogICAgY29uY2F0CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY0CiAgICAvLyBzZWxmLm1hcFtUeG4uc2VuZGVyXVswXS5iYXogPSBtb2RpZmllZAogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjU0CiAgICAvLyBtb2RpZmllZCA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlYyA3IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2NAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl1bMF0uYmF6ID0gbW9kaWZpZWQKICAgIGNvbmNhdAogICAgc3dhcAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU11dGF0aW9ucy5zdGF0ZW11dGF0aW9ucy5TdGF0ZU11dGF0aW9ucy5nZXRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NjgKICAgIC8vIGEwID0gc2VsZi5ub19wcm94eS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJub19wcm94eSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub19wcm94eSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo2OQogICAgLy8gYTEgPSBzZWxmLmdsb2JfYXNzaWduLnZhbHVlLmNvcHkoKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdsb2JfYXNzaWduIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JfYXNzaWduIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcwCiAgICAvLyBhMiA9IHNlbGYuZ2xvYi52YWx1ZS5jb3B5KCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzEKICAgIC8vIGEzID0gc2VsZi5sb2NbVHhuLnNlbmRlcl0uY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjcyCiAgICAvLyBhNCA9IHNlbGYuYm94LnZhbHVlLmNvcHkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjczCiAgICAvLyBhNSA9IHNlbGYubWFwW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgYnl0ZWMgOCAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzUKICAgIC8vIGFzc2VydCBhMCA9PSBhMSwgImV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkiCiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGdsb2JhbCBhc3NpZ24gPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NgogICAgLy8gYXNzZXJ0IGEwID09IGEyLCAiZXhwZWN0ZWQgZ2xvYmFsID09IG5vX3Byb3h5IgogICAgZGlnIDQKICAgIHVuY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgPT0gbm9fcHJveHkKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU11dGF0aW9ucy9zdGF0ZW11dGF0aW9ucy5weTo3NwogICAgLy8gYXNzZXJ0IGEwID09IGEzLCAiZXhwZWN0ZWQgbG9jYWwgPT0gbm9fcHJveHkiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzgKICAgIC8vIGFzc2VydCBhMCA9PSBhNCwgImV4cGVjdGVkIGJveCA9PSBub19wcm94eSIKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYm94ID09IG5vX3Byb3h5CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVNdXRhdGlvbnMvc3RhdGVtdXRhdGlvbnMucHk6NzkKICAgIC8vIGFzc2VydCBhMCA9PSBhNSwgImV4cGVjdGVkIG1hcCA9PSBub19wcm94eSIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG1hcCA9PSBub19wcm94eQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlTXV0YXRpb25zL3N0YXRlbXV0YXRpb25zLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE4AcEDEAAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgURCNDigQBgABJi/4kC4v8JAsiiwSLAwxBAByL/YsESU4CWYsCCBZXBgKLAUxQjAEkCIwEQv/ci/0VjAAijASLBIsCDEEAHIv/iwRJTgJZiwAIFlcGAosBTFCMASQIjARC/9yL/Iv+CBZXBgKLAVCL/YsDiwBSUIv/FYv/iwJPAlJQjACJigMBi/1RAAJJF4v9VwIAi/8kC0sBTFmL/yMIJAtLAksBWUsDFUsFi/8JIwlLAU8DTwJNSUsECU4Gi/4VTgZLBCJPBVKL/lBPBE8CTwNSUE4CTCQLTIsFiwQMQQAgiwNJiwVJTgNZiwIIiwEJFlcGAksCTF2MAyQIjAVC/9iLAIsDUIwAiSIrZURJIllMVwIAIycGiP7pK0xnIillREkiWUxXAgAjJwaI/tUpTGciJwRlREkiWUxXAgAjJwaI/sAnBExnMQBJIicFY0RJIllMVwIAIycGiP6nJwVMZii+REkiWUxXAgAjJwaI/pMovEgoTL8nCDEAUEm+REkiWUxXAgAjJwaI/nhLAbxIvyNDIitlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/sArTGciKWVESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj+iylMZyInBGVESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj+VScETGcxAEkiJwVjRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/hsnBUxmKL5ESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj95ii8SChMvycIMQBQSb5ESVcCAEsBIllLASJZSwEjCUsDFUsEJFlPAk1PA04CUkklWSJMWCcHUExEIoj9qksBvEi/I0MiKWVEIitlRCInBGVEMQAiJwVjRCi+RCcIMQBQvkRLBU8FEkRLBE8EEkRLA08DEkRLAk8CEkRLARJEgAQVH3x1TFCwI0M=", + "approval": "CyAEAAECCCYJA2JveAhub19wcm94eQIAAAtnbG9iX2Fzc2lnbgRnbG9iA2xvYxEAAgAAAAAAAAABAAoAA2JhegoACG1vZGlmaWVkA21hcDEYQAADKSpnMRtBACQxGRREMRhEggMEUm6LvwSV/vE9BAwpREs2GgCOAwE2Ab8DDgAxGY0CACMAAQAxGEQrKmcnBCpnKLxIKCq/MQAnBSpmJwgxAFBJvEgqvyNDMRgUQ4oEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv/JAtLAUxZi/8jCCQLSwJLAVlLAxVLBYv/CSMJSwFPA08CTUlLBAlOBov+FU4GSwQiTwVSi/5QTwRPAk8DUlBOAkwkC0yLBYsEDEEAIIsDSYsFSU4DWYsCCIsBCRZXBgJLAkxdjAMkCIwFQv/YiwCLA1CMAIkiK2VESSJZTFcCACMnBoj+6StMZyIpZURJIllMVwIAIycGiP7VKUxnIicEZURJIllMVwIAIycGiP7AJwRMZzEASSInBWNESSJZTFcCACMnBoj+pycFTGYovkRJIllMVwIAIycGiP6TKLxIKEy/JwgxAFBJvkRJIllMVwIAIycGiP54SwG8SL8jQyIrZURJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP7AK0xnIillRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/ospTGciJwRlRElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/lUnBExnMQBJIicFY0RJVwIASwEiWUsBIllLASMJSwMVSwQkWU8CTU8DTgJSSSVZIkxYJwdQTEQiiP4bJwVMZii+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/eYovEgoTL8nCDEAUEm+RElXAgBLASJZSwEiWUsBIwlLAxVLBCRZTwJNTwNOAlJJJVkiTFgnB1BMRCKI/apLAbxIvyNDIillRCIrZUQiJwRlRDEAIicFY0QovkQnCDEAUL5ESwVPBRJESwRPBBJESwNPAxJESwJPAhJESwESRIAEFR98dUxQsCND", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateMutations/data/StateMutations.clear.teal b/tests/artifacts/StateMutations/data/StateMutations.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateMutations/data/StateMutations.clear.teal +++ b/tests/artifacts/StateMutations/data/StateMutations.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal b/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal index 2e4e24cd..69dc2987 100644 --- a/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +++ b/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal @@ -110,7 +110,7 @@ main_after_if_else@2: bz main___algopy_default_create@39 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x1cc966ee 0x2367cd4b 0x69128e90 0x68d590e2 0x44ef0681 0x1cd294ec 0xaac8ecb1 0x166c6afd 0x3cc3bb7b 0x9a6946ad 0xded75033 0x66279e93 0x096e927b 0x97531fbc 0x6ea3f996 0xa7f4f402 0xaaddcc4c 0x5ec3116d 0x20f56eee 0x1c149a43 0xa575ac7d 0x87f0869b 0x461afc6d 0x048116ea 0x30e34a93 0xd2e646ef 0xe674a270 0xa87e540d 0x720a3ca0 0x257708f7 // method "get_implicit_key_arc4_uint()uint64", method "get_implicit_key_arc4_string()string", method "get_implicit_key_arc4_byte()byte", method "get_implicit_key_arc4_bool()bool", method "get_implicit_key_arc4_address()address", method "get_implicit_key_arc4_uint128()uint128", method "get_implicit_key_arc4_dynamic_bytes()byte[]", method "get_implicit_key_tuple()(uint64,byte[],bool)", method "get_arc4_uint()uint64", method "get_arc4_string()string", method "get_arc4_byte()byte", method "get_arc4_bool()bool", method "get_arc4_address()address", method "get_arc4_uint128()uint128", method "get_arc4_dynamic_bytes()byte[]", method "set_implicit_key_arc4_uint(uint64)void", method "set_implicit_key_arc4_string(string)void", method "set_implicit_key_arc4_byte(byte)void", method "set_implicit_key_arc4_bool(bool)void", method "set_implicit_key_arc4_address(address)void", method "set_implicit_key_arc4_uint128(uint128)void", method "set_implicit_key_arc4_dynamic_bytes(byte[])void", method "set_implicit_key_tuple((uint64,byte[],bool))void", method "set_arc4_uint(uint64)void", method "set_arc4_string(string)void", method "set_arc4_byte(byte)void", method "set_arc4_bool(bool)void", method "set_arc4_address(address)void", method "set_arc4_uint128(uint128)void", method "set_arc4_dynamic_bytes(byte[])void" @@ -124,8 +124,6 @@ main___algopy_default_create@39: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json index 892b0c24..da4c6c45 100644 --- a/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json +++ b/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json @@ -672,103 +672,91 @@ "sourceInfo": [ { "pc": [ - 543 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 772 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 908 + 906 ], "errorMessage": "check self.arc4_address exists" }, { "pc": [ - 897 + 895 ], "errorMessage": "check self.arc4_bool exists" }, { "pc": [ - 886 + 884 ], "errorMessage": "check self.arc4_byte exists" }, { "pc": [ - 930 + 928 ], "errorMessage": "check self.arc4_dynamic_bytes exists" }, { "pc": [ - 875 + 873 ], "errorMessage": "check self.arc4_string exists" }, { "pc": [ - 864 + 862 ], "errorMessage": "check self.arc4_uint exists" }, { "pc": [ - 919 + 917 ], "errorMessage": "check self.arc4_uint128 exists" }, { "pc": [ - 820 + 818 ], "errorMessage": "check self.implicit_key_arc4_address exists" }, { "pc": [ - 809 + 807 ], "errorMessage": "check self.implicit_key_arc4_bool exists" }, { "pc": [ - 798 + 796 ], "errorMessage": "check self.implicit_key_arc4_byte exists" }, { "pc": [ - 842 + 840 ], "errorMessage": "check self.implicit_key_arc4_dynamic_bytes exists" }, { "pc": [ - 788 + 786 ], "errorMessage": "check self.implicit_key_arc4_string exists" }, { "pc": [ - 778 + 776 ], "errorMessage": "check self.implicit_key_arc4_uint exists" }, { "pc": [ - 831 + 829 ], "errorMessage": "check self.implicit_key_arc4_uint128 exists" }, { "pc": [ - 853 + 851 ], "errorMessage": "check self.implicit_key_tuple exists" } @@ -781,19 +769,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgxY2M5NjZlZSAweDIzNjdjZDRiIDB4NjkxMjhlOTAgMHg2OGQ1OTBlMiAweDQ0ZWYwNjgxIDB4MWNkMjk0ZWMgMHhhYWM4ZWNiMSAweDE2NmM2YWZkIDB4M2NjM2JiN2IgMHg5YTY5NDZhZCAweGRlZDc1MDMzIDB4NjYyNzllOTMgMHgwOTZlOTI3YiAweDk3NTMxZmJjIDB4NmVhM2Y5OTYgMHhhN2Y0ZjQwMiAweGFhZGRjYzRjIDB4NWVjMzExNmQgMHgyMGY1NmVlZSAweDFjMTQ5YTQzIDB4YTU3NWFjN2QgMHg4N2YwODY5YiAweDQ2MWFmYzZkIDB4MDQ4MTE2ZWEgMHgzMGUzNGE5MyAweGQyZTY0NmVmIDB4ZTY3NGEyNzAgMHhhODdlNTQwZCAweDcyMGEzY2EwIDB4MjU3NzA4ZjcgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKClieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KCl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKCkodWludDY0LGJ5dGVbXSxib29sKSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcygpYnl0ZVtdIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV90dXBsZSgodWludDY0LGJ5dGVbXSxib29sKSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ib29sKGJvb2wpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X3VpbnQxMjgodWludDEyOCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9keW5hbWljX2J5dGVzKGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIHNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IHNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIHNldF9pbXBsaWNpdF9rZXlfdHVwbGUgc2V0X2FyYzRfdWludCBzZXRfYXJjNF9zdHJpbmcgc2V0X2FyYzRfYnl0ZSBzZXRfYXJjNF9ib29sIHNldF9hcmM0X2FkZHJlc3Mgc2V0X2FyYzRfdWludDEyOCBzZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMzk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQxCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzOC01MzkKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18yIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0OQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTMKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU3CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjUKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV90dXBsZSBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc0CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnQudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NzEtNTcyCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NzgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgyCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4NgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTAKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTk0CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5OAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50LnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAwLTYwMQogICAgLy8gIyBTZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZy52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18yIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxNQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxNQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlID0gdmFsdWUuY29weSgpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjMxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfdHVwbGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM2CiAgICAvLyBzZWxmLmFyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMy02MzQKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM2CiAgICAvLyBzZWxmLmFyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMy02MzQKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0MAogICAgLy8gc2VsZi5hcmM0X3N0cmluZy52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ0CiAgICAvLyBzZWxmLmFyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ0CiAgICAvLyBzZWxmLmFyYzRfYnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDgKICAgIC8vIHNlbGYuYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDgKICAgIC8vIHNlbGYuYXJjNF9ib29sLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU2CiAgICAvLyBzZWxmLmFyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU2CiAgICAvLyBzZWxmLmFyYzRfdWludDEyOC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NjAKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlID0gdmFsdWUuY29weSgpCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAiaW1wbGljaXRfa2V5X3R1cGxlIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIgImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE1LTUxNgogICAgLy8gIyBJbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQ2NCgxMzM3KSkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlYyAxNiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpKQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgMTcgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSA9IEdsb2JhbFN0YXRlKGFyYzQuQnl0ZSgwKSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCA9IEdsb2JhbFN0YXRlKGFyYzQuQm9vbChUcnVlKSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyA9IEdsb2JhbFN0YXRlKGFyYzQuQWRkcmVzcyhHbG9iYWwuY3JlYXRvcl9hZGRyZXNzKSkKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyAxOCAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzID0gR2xvYmFsU3RhdGUoYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikpCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZSA9IEdsb2JhbFN0YXRlKChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYTAwMGIwMDAwMDQ3NDY1NzM3NAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjUtNTI2CiAgICAvLyAjIEV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIHNlbGYuYXJjNF91aW50ID0gR2xvYmFsU3RhdGUoYXJjNC5VSW50NjQoMTMzNyksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfdWludCIpCiAgICBieXRlYyA5IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwNTM5CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hcmM0X3N0cmluZyA9IEdsb2JhbFN0YXRlKGFyYzQuU3RyaW5nKCJIZWxsbyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIpCiAgICBieXRlYyAxMCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSkKICAgIGJ5dGVjIDE3IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcgPSBHbG9iYWxTdGF0ZShhcmM0LlN0cmluZygiSGVsbG8iKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuYXJjNF9ieXRlID0gR2xvYmFsU3RhdGUoYXJjNC5CeXRlKDApLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiKQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjkKICAgIC8vIHNlbGYuYXJjNF9ib29sID0gR2xvYmFsU3RhdGUoYXJjNC5Cb29sKFRydWUpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiKQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTE5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSkpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUyOQogICAgLy8gc2VsZi5hcmM0X2Jvb2wgPSBHbG9iYWxTdGF0ZShhcmM0LkJvb2woVHJ1ZSksIGtleT0iZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMC01MzIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjggPSBHbG9iYWxTdGF0ZShhcmM0LlVJbnQxMjgoMioqMTAwKSwga2V5PSJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IikKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgMTggLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MjIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpKQogICAgYnl0ZWMgMTkgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzQtNTM2CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpLCBrZXk9ImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEzCiAgICAvLyBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAzOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MWNjOTY2ZWUgMHgyMzY3Y2Q0YiAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDFjZDI5NGVjIDB4YWFjOGVjYjEgMHgxNjZjNmFmZCAweDNjYzNiYjdiIDB4OWE2OTQ2YWQgMHhkZWQ3NTAzMyAweDY2Mjc5ZTkzIDB4MDk2ZTkyN2IgMHg5NzUzMWZiYyAweDZlYTNmOTk2IDB4YTdmNGY0MDIgMHhhYWRkY2M0YyAweDVlYzMxMTZkIDB4MjBmNTZlZWUgMHgxYzE0OWE0MyAweGE1NzVhYzdkIDB4ODdmMDg2OWIgMHg0NjFhZmM2ZCAweDA0ODExNmVhIDB4MzBlMzRhOTMgMHhkMmU2NDZlZiAweGU2NzRhMjcwIDB4YTg3ZTU0MGQgMHg3MjBhM2NhMCAweDI1NzcwOGY3IC8vIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZygpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKClhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZSgpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FyYzRfc3RyaW5nKClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woKWJvb2wiLCBtZXRob2QgImdldF9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfdHVwbGUoKHVpbnQ2NCxieXRlW10sYm9vbCkpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfdWludCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfc3RyaW5nKHN0cmluZyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYm9vbChib29sKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2FkZHJlc3MoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50MTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2wgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZ2V0X2ltcGxpY2l0X2tleV90dXBsZSBnZXRfYXJjNF91aW50IGdldF9hcmM0X3N0cmluZyBnZXRfYXJjNF9ieXRlIGdldF9hcmM0X2Jvb2wgZ2V0X2FyYzRfYWRkcmVzcyBnZXRfYXJjNF91aW50MTI4IGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBzZXRfaW1wbGljaXRfa2V5X3R1cGxlIHNldF9hcmM0X3VpbnQgc2V0X2FyYzRfc3RyaW5nIHNldF9hcmM0X2J5dGUgc2V0X2FyYzRfYm9vbCBzZXRfYXJjNF9hZGRyZXNzIHNldF9hcmM0X3VpbnQxMjggc2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDM5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MzgtNTM5CiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NDkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUzCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1NwogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjEKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjggZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY1CiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NjkKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV90dXBsZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTcxLTU3MgogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc4CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9zdHJpbmcgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF9ieXRlLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODYKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkwCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3MudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X2FkZHJlc3MgZXhpc3RzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50MTI4LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTgKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludC52YWx1ZSA9IHZhbHVlCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwMC02MDEKICAgIC8vICMgU2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjAzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDAtNjAxCiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjExCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyA0IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MTUKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxOQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIzCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjcKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI3CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfdHVwbGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X3R1cGxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzMQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hcmM0X3VpbnQudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzMtNjM0CiAgICAvLyAjIFNldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDAKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmcudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQwCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gc2VsZi5hcmM0X2J5dGUudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQ4CiAgICAvLyBzZWxmLmFyYzRfYm9vbC52YWx1ZSA9IHZhbHVlCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuR2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTIKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzLnZhbHVlID0gdmFsdWUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5HbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gc2VsZi5hcmM0X3VpbnQxMjgudmFsdWUgPSB2YWx1ZQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Lkdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlcy52YWx1ZSA9IHZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXMudmFsdWUgPSB2YWx1ZS5jb3B5KCkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACwAVAB8AKQA0AD8ASgBVAGAAawB2AIEAjACXAKIArQC0ALsAwgDKANIA2gDiAOoA8gD6AQIBCgESARoAMRkUMRgUEEQiQyMpZUQoTFCwIkMjKmVEKExQsCJDIytlRChMULAiQyMnBGVEKExQsCJDIycFZUQoTFCwIkMjJwZlRChMULAiQyMnB2VEKExQsCJDIycIZUQoTFCwIkMjJwllRChMULAiQyMnCmVEKExQsCJDIycLZUQoTFCwIkMjJwxlRChMULAiQyMnDWVEKExQsCJDIycOZUQoTFCwIkMjJw9lRChMULAiQyk2GgFnIkMqNhoBZyJDKzYaAWciQycENhoBZyJDJwU2GgFnIkMnBjYaAWciQycHNhoBZyJDJwg2GgFnIkMnCTYaAWciQycKNhoBZyJDJws2GgFnIkMnDDYaAWciQycNNhoBZyJDJw42GgFnIkMnDzYaAWciQw==", + "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nFmltcGxpY2l0X2tleV9hcmM0X2J5dGUWaW1wbGljaXRfa2V5X2FyYzRfYm9vbBlpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzGWltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcxJpbXBsaWNpdF9rZXlfdHVwbGUWZXhwbGljaXRfa2V5X2FyYzRfdWludBhleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmcWZXhwbGljaXRfa2V5X2FyYzRfYnl0ZRZleHBsaWNpdF9rZXlfYXJjNF9ib29sGWV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOB9leHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCAAAAAAAAAU5BwAFSGVsbG8QAAAAEAAAAAAAAAAAAAAAAA8ADWR5bmFtaWMgYnl0ZXMxGEAAXSknEGcqJxFnK4ABAGcnBIABgGcnBTIJZycGJxJnJwcnE2cnCIARAAAAAAAAAAoACwAABHRlc3RnJwknEGcnCicRZycLgAEAZycMgAGAZycNMglnJw4nEmcnDycTZzEbQQDhMRkURDEYRIIeBBzJZu4EI2fNSwRpEo6QBGjVkOIERO8GgQQc0pTsBKrI7LEEFmxq/QQ8w7t7BJppRq0E3tdQMwRmJ56TBAluknsEl1MfvARuo/mWBKf09AIEqt3MTARewxFtBCD1bu4EHBSaQwSldax9BIfwhpsERhr8bQQEgRbqBDDjSpME0uZG7wTmdKJwBKh+VA0Ecgo8oAQldwj3NhoAjh4ACQATAB0AJwAyAD0ASABTAF4AaQB0AH8AigCVAKAAqwCyALkAwADIANAA2ADgAOgA8AD4AQABCAEQARgAMRkUMRgUEEMjKWVEKExQsCJDIyplRChMULAiQyMrZUQoTFCwIkMjJwRlRChMULAiQyMnBWVEKExQsCJDIycGZUQoTFCwIkMjJwdlRChMULAiQyMnCGVEKExQsCJDIycJZUQoTFCwIkMjJwplRChMULAiQyMnC2VEKExQsCJDIycMZUQoTFCwIkMjJw1lRChMULAiQyMnDmVEKExQsCJDIycPZUQoTFCwIkMpNhoBZyJDKjYaAWciQys2GgFnIkMnBDYaAWciQycFNhoBZyJDJwY2GgFnIkMnBzYaAWciQycINhoBZyJDJwk2GgFnIkMnCjYaAWciQycLNhoBZyJDJww2GgFnIkMnDTYaAWciQycONhoBZyJDJw82GgFnIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal b/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal +++ b/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal b/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal index 5dd2d8d6..31d26f15 100644 --- a/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal +++ b/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal @@ -21,7 +21,7 @@ main_verify_itxn_ops_route@3: ! txn ApplicationID && - assert // OnCompletion must be NoOp && can only call when not creating + assert b verify_itxn_ops main___algopy_default_create@5: @@ -30,8 +30,6 @@ main___algopy_default_create@5: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -112,6 +110,8 @@ verify_itxn_ops: gitxn 1 TypeEnum intc_0 // pay == + assert // tests/artifacts/StateOps/contract.py:489 // @arc4.abimethod() + intc_0 // 1 return diff --git a/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json b/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json index 5bfeee8f..efad812b 100644 --- a/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json +++ b/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json @@ -54,20 +54,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 49 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 38 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when not creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -76,19 +63,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgdmVyaWZ5X2l0eG5fb3BzCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDU6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5JVHhuT3BzQ29udHJhY3QudmVyaWZ5X2l0eG5fb3BzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2l0eG5fb3BzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5MQogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuYmVnaW4oKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5MgogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkzCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfb25fY29tcGxldGlvbihhbGdvcHkuT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbikKICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTQKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk1LTQ5NgogICAgLy8gIyBwYWdlcyBlc3NlbnRpYWxseSBhcHBlbmRzCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfYXBwcm92YWxfcHJvZ3JhbV9wYWdlcyhCeXRlcy5mcm9tX2hleCgiMDY4MTAxIikpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk3CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbShCeXRlcy5mcm9tX2hleCgiMDY4MTAxIikpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk4CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfZmVlKGFsZ29weS5vcC5HbG9iYWwubWluX3R4bl9mZWUpCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5OQogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUubmV4dCgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDAKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50KQogICAgaW50Y18wIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMQogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3JlY2VpdmVyKGFsZ29weS5vcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfYW1vdW50KGFsZ29weS5VSW50NjQoMTAwMCkpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwNQogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5JVHhuLnJlY2VpdmVyKCkgPT0gYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGl0eG4gUmVjZWl2ZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwNgogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5JVHhuLmFtb3VudCgpID09IGFsZ29weS5VSW50NjQoMTAwMCkKICAgIGl0eG4gQW1vdW50CiAgICBpbnRjXzIgLy8gMTAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwNwogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5JVHhuLnR5cGVfZW51bSgpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgaXR4biBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwOQogICAgLy8gYXNzZXJ0IGFsZ29weS5vcC5HSVR4bi50eXBlX2VudW0oMCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIGdpdHhuIDAgVHlwZUVudW0KICAgIGludGNfMSAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEwCiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgxKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQKICAgIGdpdHhuIDEgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gY2xhc3MgSVR4bk9wc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg0ZTdjZDljYiAvLyBtZXRob2QgInZlcmlmeV9pdHhuX29wcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDMKICAgIGVycgoKbWFpbl92ZXJpZnlfaXR4bl9vcHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB2ZXJpZnlfaXR4bl9vcHMKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDkyCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKGFsZ29weS5UcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9vbl9jb21wbGV0aW9uKGFsZ29weS5PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uKQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5NAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X2FwcHJvdmFsX3Byb2dyYW0oQnl0ZXMuZnJvbV9oZXgoIjA2ODEwMSIpKQogICAgYnl0ZWNfMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTUtNDk2CiAgICAvLyAjIHBhZ2VzIGVzc2VudGlhbGx5IGFwcGVuZHMKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTcKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKEJ5dGVzLmZyb21faGV4KCIwNjgxMDEiKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0OTgKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9mZWUoYWxnb3B5Lm9wLkdsb2JhbC5taW5fdHhuX2ZlZSkKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDk5CiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMAogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc2V0X3R5cGVfZW51bShhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTAxCiAgICAvLyBhbGdvcHkub3AuSVR4bkNyZWF0ZS5zZXRfcmVjZWl2ZXIoYWxnb3B5Lm9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MDIKICAgIC8vIGFsZ29weS5vcC5JVHhuQ3JlYXRlLnNldF9hbW91bnQoYWxnb3B5LlVJbnQ2NCgxMDAwKSkKICAgIGludGNfMiAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYWxnb3B5Lm9wLklUeG5DcmVhdGUuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA1CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4ucmVjZWl2ZXIoKSA9PSBhbGdvcHkub3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgaXR4biBSZWNlaXZlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA2CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4uYW1vdW50KCkgPT0gYWxnb3B5LlVJbnQ2NCgxMDAwKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMiAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA3CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLklUeG4udHlwZV9lbnVtKCkgPT0gYWxnb3B5LlRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTA5CiAgICAvLyBhc3NlcnQgYWxnb3B5Lm9wLkdJVHhuLnR5cGVfZW51bSgwKSA9PSBhbGdvcHkuVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18xIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MTAKICAgIC8vIGFzc2VydCBhbGdvcHkub3AuR0lUeG4udHlwZV9lbnVtKDEpID09IGFsZ29weS5UcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgZ2l0eG4gMSBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAKMRkUMRgUEEQiQ7EjshCBBbIZKLIeKLJAKLIfMgCyAbYishAyCbIHJLIIs7QHMgkSRLQIJBJEtBAiEkS3ABAjEkS3ARAiEkM=", + "approval": "CyADAQboByYBAwaBATEbQQAYgAROfNnLNhoAjgEAAQAxGRQxGBBEQgAIMRkUMRgUEEOxI7IQgQWyGSiyHiiyQCiyHzIAsgG2IrIQMgmyBySyCLO0BzIJEkS0CCQSRLQQIhJEtwAQIxJEtwEQIhJEIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal b/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal +++ b/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/LocalStateContract.approval.teal b/tests/artifacts/StateOps/data/LocalStateContract.approval.teal index 002453cd..edfa3856 100644 --- a/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +++ b/tests/artifacts/StateOps/data/LocalStateContract.approval.teal @@ -18,7 +18,7 @@ main_switch_case_next@6: // class LocalStateContract(ARC4Contract): txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xb3cfa389 0xdb858176 0x78267762 0x426351c8 0x075cae91 0x59c0b80b 0x0d6fa690 0x97e10d9c 0x2e4a8c49 0xb22cd21e 0xb3f44701 0xedd97297 0x671d353c 0xa3fd6fdc 0xcd2e5d66 // method "get_implicit_key_arc4_uint(address)uint64", method "get_implicit_key_arc4_string(address)string", method "get_implicit_key_arc4_byte(address)byte", method "get_implicit_key_arc4_bool(address)bool", method "get_implicit_key_arc4_address(address)address", method "get_implicit_key_arc4_uint128(address)uint128", method "get_implicit_key_arc4_dynamic_bytes(address)byte[]", method "get_implicit_key_tuple(address)(uint64,byte[],bool)", method "get_arc4_uint(address)uint64", method "get_arc4_string(address)string", method "get_arc4_byte(address)byte", method "get_arc4_bool(address)bool", method "get_arc4_address(address)address", method "get_arc4_uint128(address)uint128", method "get_arc4_dynamic_bytes(address)byte[]" @@ -34,7 +34,7 @@ main_opt_in_route@5: == txn ApplicationID && - assert // OnCompletion must be OptIn && can only call when not creating + assert b opt_in main___algopy_default_create@26: @@ -43,8 +43,6 @@ main___algopy_default_create@26: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return diff --git a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json index 5ef70154..8ddcc46e 100644 --- a/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +++ b/tests/artifacts/StateOps/data/LocalStateContract.arc56.json @@ -448,109 +448,91 @@ "sourceInfo": [ { "pc": [ - 458 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 593 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 582 - ], - "errorMessage": "OnCompletion must be OptIn && can only call when not creating" - }, - { - "pc": [ - 893 + 891 ], "errorMessage": "check self.arc4_address exists for account" }, { "pc": [ - 879 + 877 ], "errorMessage": "check self.arc4_bool exists for account" }, { "pc": [ - 865 + 863 ], "errorMessage": "check self.arc4_byte exists for account" }, { "pc": [ - 921 + 919 ], "errorMessage": "check self.arc4_dynamic_bytes exists for account" }, { "pc": [ - 851 + 849 ], "errorMessage": "check self.arc4_string exists for account" }, { "pc": [ - 837 + 835 ], "errorMessage": "check self.arc4_uint exists for account" }, { "pc": [ - 907 + 905 ], "errorMessage": "check self.arc4_uint128 exists for account" }, { "pc": [ - 781 + 779 ], "errorMessage": "check self.implicit_key_arc4_address exists for account" }, { "pc": [ - 767 + 765 ], "errorMessage": "check self.implicit_key_arc4_bool exists for account" }, { "pc": [ - 753 + 751 ], "errorMessage": "check self.implicit_key_arc4_byte exists for account" }, { "pc": [ - 809 + 807 ], "errorMessage": "check self.implicit_key_arc4_dynamic_bytes exists for account" }, { "pc": [ - 739 + 737 ], "errorMessage": "check self.implicit_key_arc4_string exists for account" }, { "pc": [ - 726 + 724 ], "errorMessage": "check self.implicit_key_arc4_uint exists for account" }, { "pc": [ - 795 + 793 ], "errorMessage": "check self.implicit_key_arc4_uint128 exists for account" }, { "pc": [ - 823 + 821 ], "errorMessage": "check self.implicit_key_tuple exists for account" } @@ -563,19 +545,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGIzY2ZhMzg5IDB4ZGI4NTgxNzYgMHg3ODI2Nzc2MiAweDQyNjM1MWM4IDB4MDc1Y2FlOTEgMHg1OWMwYjgwYiAweDBkNmZhNjkwIDB4OTdlMTBkOWMgMHgyZTRhOGM0OSAweGIyMmNkMjFlIDB4YjNmNDQ3MDEgMHhlZGQ5NzI5NyAweDY3MWQzNTNjIDB4YTNmZDZmZGMgMHhjZDJlNWQ2NiAvLyBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nKGFkZHJlc3Mpc3RyaW5nIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoYWRkcmVzcylhZGRyZXNzIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X3R1cGxlKGFkZHJlc3MpKHVpbnQ2NCxieXRlW10sYm9vbCkiLCBtZXRob2QgImdldF9hcmM0X3VpbnQoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImdldF9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZShhZGRyZXNzKWJ5dGUiLCBtZXRob2QgImdldF9hcmM0X2Jvb2woYWRkcmVzcylib29sIiwgbWV0aG9kICJnZXRfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludDEyOChhZGRyZXNzKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoYWRkcmVzcylieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIGdldF9pbXBsaWNpdF9rZXlfdHVwbGUgZ2V0X2FyYzRfdWludCBnZXRfYXJjNF9zdHJpbmcgZ2V0X2FyYzRfYnl0ZSBnZXRfYXJjNF9ib29sIGdldF9hcmM0X2FkZHJlc3MgZ2V0X2FyYzRfdWludDEyOCBnZXRfYXJjNF9keW5hbWljX2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBPcHRJbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5vcHRfaW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg4CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQ2NCgxMzM3KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkwCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIHB1c2hieXRlcyAweDgwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkyCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkzCiAgICAvLyBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTItNjk0CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoCiAgICAvLyAgICAgR2xvYmFsLmNyZWF0b3JfYWRkcmVzcwogICAgLy8gKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Ni02OTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHluYW1pYyBieXRlcyIKICAgIC8vICkKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV90dXBsZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IChVSW50NjQoMTApLCBCeXRlcyhiInRlc3QiKSwgRmFsc2UpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEyIC8vICJpbXBsaWNpdF9rZXlfdHVwbGUiCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBhMDAwYjAwMDAwNDc0NjU3Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAxCiAgICAvLyBzZWxmLmFyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAyCiAgICAvLyBzZWxmLmFyYzRfc3RyaW5nW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5TdHJpbmcoIkhlbGxvIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDMKICAgIC8vIHNlbGYuYXJjNF9ieXRlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5CeXRlKDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDQKICAgIC8vIHNlbGYuYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5MQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5Cb29sKFRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDUKICAgIC8vIHNlbGYuYXJjNF9hZGRyZXNzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5BZGRyZXNzKEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA2CiAgICAvLyBzZWxmLmFyYzRfdWludDEyOFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDEyOCgyKioxMDApCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Ni02OTgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHluYW1pYyBieXRlcyIKICAgIC8vICkKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuRHluYW1pY0J5dGVzKGIiZHluYW1pYyBieXRlcyIpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwOS03MTAKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGltcGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzEyCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTYKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjAKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2J5dGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjQKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjgKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3NbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzYKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMCAvLyAiaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV90dXBsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfdHVwbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0MAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmltcGxpY2l0X2tleV90dXBsZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NQogICAgLy8gcmV0dXJuIHNlbGYuYXJjNF91aW50W2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3VpbnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQyLTc0MwogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgZXhwbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hcmM0X3N0cmluZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ5CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3N0cmluZ1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmM0X3N0cmluZyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzUzCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2J5dGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYnl0ZSBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzU3CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2Jvb2xbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYm9vbCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzYxCiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2FkZHJlc3NbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxNyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfYWRkcmVzcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfdWludDEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnQxMjhbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludDEyOCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X2R5bmFtaWNfYnl0ZXNbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiaW1wbGljaXRfa2V5X2FyYzRfdWludCIgMHgwMDAwMDAwMDAwMDAwNTM5ICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciIDB4MDAwNTQ4NjU2YzZjNmYgImltcGxpY2l0X2tleV9hcmM0X2J5dGUiICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIiAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczICJpbXBsaWNpdF9rZXlfdHVwbGUiICJleHBsaWNpdF9rZXlfYXJjNF91aW50IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyaW5nIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludDEyOCIgImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjYzCiAgICAvLyBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiM2NmYTM4OSAweGRiODU4MTc2IDB4NzgyNjc3NjIgMHg0MjYzNTFjOCAweDA3NWNhZTkxIDB4NTljMGI4MGIgMHgwZDZmYTY5MCAweDk3ZTEwZDljIDB4MmU0YThjNDkgMHhiMjJjZDIxZSAweGIzZjQ0NzAxIDB4ZWRkOTcyOTcgMHg2NzFkMzUzYyAweGEzZmQ2ZmRjIDB4Y2QyZTVkNjYgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludChhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyhhZGRyZXNzKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbChhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKGFkZHJlc3MpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyhhZGRyZXNzKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV90dXBsZShhZGRyZXNzKSh1aW50NjQsYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJnZXRfYXJjNF91aW50KGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHJpbmcoYWRkcmVzcylzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWRkcmVzcylieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnQxMjgoYWRkcmVzcyl1aW50MTI4IiwgbWV0aG9kICJnZXRfYXJjNF9keW5hbWljX2J5dGVzKGFkZHJlc3MpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOCBnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBnZXRfaW1wbGljaXRfa2V5X3R1cGxlIGdldF9hcmM0X3VpbnQgZ2V0X2FyYzRfc3RyaW5nIGdldF9hcmM0X2J5dGUgZ2V0X2FyYzRfYm9vbCBnZXRfYXJjNF9hZGRyZXNzIGdldF9hcmM0X3VpbnQxMjggZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgZXJyCgptYWluX29wdF9pbl9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDI2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODgKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuVUludDY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY4OQogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlY18zIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTAKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTEKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTIKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgNyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTMKICAgIC8vIEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5Mi02OTQKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQWRkcmVzcygKICAgIC8vICAgICBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzCiAgICAvLyApCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjhbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlVJbnQxMjgoMioqMTAwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBieXRlYyA4IC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkR5bmFtaWNCeXRlcygKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OTkKICAgIC8vIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gKFVJbnQ2NCgxMCksIEJ5dGVzKGIidGVzdCIpLCBGYWxzZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTIgLy8gImltcGxpY2l0X2tleV90dXBsZSIKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGEwMDBiMDAwMDA0NzQ2NTczNzQKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDEKICAgIC8vIHNlbGYuYXJjNF91aW50W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50NjQoMTMzNykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQiCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gc2VsZi5hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGJ5dGVjIDE0IC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHJpbmciCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njg5CiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuU3RyaW5nKCJIZWxsbyIpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDIKICAgIC8vIHNlbGYuYXJjNF9zdHJpbmdbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gc2VsZi5hcmM0X2J5dGVbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTUgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNAogICAgLy8gc2VsZi5hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkxCiAgICAvLyBzZWxmLmltcGxpY2l0X2tleV9hcmM0X2Jvb2xbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkJvb2woVHJ1ZSkKICAgIHB1c2hieXRlcyAweDgwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA0CiAgICAvLyBzZWxmLmFyYzRfYm9vbFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFyYzQuQm9vbChUcnVlKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gc2VsZi5hcmM0X2FkZHJlc3NbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhcmM0LkFkZHJlc3MoR2xvYmFsLmNyZWF0b3JfYWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTcgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXJjNF91aW50MTI4W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5VSW50MTI4KDIqKjEwMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Njk2LTY5OAogICAgLy8gc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkeW5hbWljIGJ5dGVzIgogICAgLy8gKQogICAgYnl0ZWMgMTEgLy8gMHgwMDBkNjQ3OTZlNjE2ZDY5NjMyMDYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDcKICAgIC8vIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYXJjNC5EeW5hbWljQnl0ZXMoYiJkeW5hbWljIGJ5dGVzIikKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzA5LTcxMAogICAgLy8gIyBHZXR0ZXIgbWV0aG9kcyBmb3IgaW1wbGljaXQga2V5IHN0YXRlIHZhcmlhYmxlcwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MTIKICAgIC8vIHJldHVybiBzZWxmLmltcGxpY2l0X2tleV9hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJpbXBsaWNpdF9rZXlfYXJjNF91aW50IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MDktNzEwCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBpbXBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cmluZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJpbmc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImltcGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0X2tleV9hcmM0X3VpbnQxMjgiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbXBsaWNpdF9rZXlfYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczNgogICAgLy8gcmV0dXJuIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X3R1cGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2ltcGxpY2l0X2tleV90dXBsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQwCiAgICAvLyByZXR1cm4gc2VsZi5pbXBsaWNpdF9rZXlfdHVwbGVbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMiAvLyAiaW1wbGljaXRfa2V5X3R1cGxlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW1wbGljaXRfa2V5X3R1cGxlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjczOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0Mi03NDMKICAgIC8vICMgR2V0dGVyIG1ldGhvZHMgZm9yIGV4cGxpY2l0IGtleSBzdGF0ZSB2YXJpYWJsZXMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hcmM0X3VpbnRbYV0KICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMyAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfdWludCBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDItNzQzCiAgICAvLyAjIEdldHRlciBtZXRob2RzIGZvciBleHBsaWNpdCBrZXkgc3RhdGUgdmFyaWFibGVzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5Mb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyaW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FyYzRfc3RyaW5nOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NDkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfc3RyaW5nW2FdCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0cmluZyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYzRfc3RyaW5nIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTMKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYnl0ZVthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ieXRlIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NTcKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYm9vbFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9ib29sIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjEKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfYWRkcmVzc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9hZGRyZXNzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnQxMjhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF91aW50MTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjUKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfdWludDEyOFthXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4IgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF91aW50MTI4IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuTG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NjkKICAgIC8vIHJldHVybiBzZWxmLmFyYzRfZHluYW1pY19ieXRlc1thXQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJjNF9keW5hbWljX2J5dGVzIGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCSAJ8ArAC6AMgA1gDkAPIBAAEOARwBKgE4AUYBVAAxGSISMRgQREIACjEZFDEYFBBEIkMyCSkqZjIJKycEZjIJJwWAAQBmMgknBoABgGYyCScHMglmMgknCCcJZjIJJwonC2YyCScMgBEAAAAAAAAACgALAAAEdGVzdGYyCScNKmYyCScOJwRmMgknD4ABAGYyCScQgAGAZjIJJxEyCWYyCScSJwlmMgknEycLZiJDNhoBIyljRChMULAiQzYaASMrY0QoTFCwIkM2GgEjJwVjRChMULAiQzYaASMnBmNEKExQsCJDNhoBIycHY0QoTFCwIkM2GgEjJwhjRChMULAiQzYaASMnCmNEKExQsCJDNhoBIycMY0QoTFCwIkM2GgEjJw1jRChMULAiQzYaASMnDmNEKExQsCJDNhoBIycPY0QoTFCwIkM2GgEjJxBjRChMULAiQzYaASMnEWNEKExQsCJDNhoBIycSY0QoTFCwIkM2GgEjJxNjRChMULAiQw==", + "approval": "CyACAQAmFAQVH3x1FmltcGxpY2l0X2tleV9hcmM0X3VpbnQIAAAAAAAABTkYaW1wbGljaXRfa2V5X2FyYzRfc3RyaW5nBwAFSGVsbG8WaW1wbGljaXRfa2V5X2FyYzRfYnl0ZRZpbXBsaWNpdF9rZXlfYXJjNF9ib29sGWltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MZaW1wbGljaXRfa2V5X2FyYzRfdWludDEyOBAAAAAQAAAAAAAAAAAAAAAAH2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMPAA1keW5hbWljIGJ5dGVzEmltcGxpY2l0X2tleV90dXBsZRZleHBsaWNpdF9rZXlfYXJjNF91aW50GGV4cGxpY2l0X2tleV9hcmM0X3N0cmluZxZleHBsaWNpdF9rZXlfYXJjNF9ieXRlFmV4cGxpY2l0X2tleV9hcmM0X2Jvb2wZZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcxlleHBsaWNpdF9rZXlfYXJjNF91aW50MTI4H2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMxG0EAkIAEMMbVijYaAI4BAHgxGRREMRhEgg8Es8+jiQTbhYF2BHgmd2IEQmNRyAQHXK6RBFnAuAsEDW+mkASX4Q2cBC5KjEkEsizSHgSz9EcBBO3ZcpcEZx01PASj/W/cBM0uXWY2GgCODwCQAJ0AqgC4AMYA1ADiAPAA/gEMARoBKAE2AUQBUgAxGSISMRgQREIACDEZFDEYFBBDMgkpKmYyCSsnBGYyCScFgAEAZjIJJwaAAYBmMgknBzIJZjIJJwgnCWYyCScKJwtmMgknDIARAAAAAAAAAAoACwAABHRlc3RmMgknDSpmMgknDicEZjIJJw+AAQBmMgknEIABgGYyCScRMglmMgknEicJZjIJJxMnC2YiQzYaASMpY0QoTFCwIkM2GgEjK2NEKExQsCJDNhoBIycFY0QoTFCwIkM2GgEjJwZjRChMULAiQzYaASMnB2NEKExQsCJDNhoBIycIY0QoTFCwIkM2GgEjJwpjRChMULAiQzYaASMnDGNEKExQsCJDNhoBIycNY0QoTFCwIkM2GgEjJw5jRChMULAiQzYaASMnD2NEKExQsCJDNhoBIycQY0QoTFCwIkM2GgEjJxFjRChMULAiQzYaASMnEmNEKExQsCJDNhoBIycTY0QoTFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/LocalStateContract.clear.teal b/tests/artifacts/StateOps/data/LocalStateContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/LocalStateContract.clear.teal +++ b/tests/artifacts/StateOps/data/LocalStateContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal index 91a4033e..6e27dcae 100644 --- a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@22 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x5f5b43e4 0x73dc93c7 0x5626dfeb 0xdc8a25bf 0x198ebd8c 0x2301ab26 0x9f68fca6 0xa975c2d1 0xd1e04801 0xb6966be5 0x195d5418 0x6adae3f1 0xdf8cfee5 0x6ad70d21 0x1735fd22 // method "verify_acct_balance(account)uint64", method "verify_acct_min_balance(account)uint64", method "verify_acct_auth_addr(account)address", method "verify_acct_total_num_uint(account)uint64", method "verify_acct_total_num_byte_slice(account)uint64", method "verify_acct_total_extra_app_pages(account)uint64", method "verify_acct_total_apps_created(account)uint64", method "verify_acct_total_apps_opted_in(account)uint64", method "verify_acct_total_assets_created(account)uint64", method "verify_acct_total_assets(account)uint64", method "verify_acct_total_boxes(account)uint64", method "verify_acct_total_box_bytes(account)uint64", method "verify_acct_incentive_eligible(account)bool", method "verify_acct_last_heartbeat(account)uint64", method "verify_acct_last_proposed(account)uint64" @@ -25,8 +25,6 @@ main___algopy_default_create@22: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -577,7 +575,7 @@ verify_acct_incentive_eligible: // tests/artifacts/StateOps/contract.py:137 // @arc4.abimethod(resource_encoding="index") pushbytes 0x00 - pushint 0 // 0 + pushint 0 uncover 2 setbit bytec_0 // 0x151f7c75 diff --git a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json index 59eafb79..ac33d82d 100644 --- a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json @@ -356,96 +356,84 @@ "sourceInfo": [ { "pc": [ - 19 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 143 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 173, - 227 + 171, + 225 ], "errorMessage": "account funded" }, { "pc": [ - 177 + 175 ], "errorMessage": "expected Account balance to match" }, { "pc": [ - 231 + 229 ], "errorMessage": "expected Account min_balance to match" }, { "pc": [ - 168, - 222, - 275, - 303, - 332, - 361, - 390, - 419, - 448, - 477, - 506, - 535, - 564, - 600, - 629 + 166, + 220, + 273, + 301, + 330, + 359, + 388, + 417, + 446, + 475, + 504, + 533, + 562, + 598, + 627 ], "errorMessage": "expected funded by index to match" }, { "pc": [ - 192 + 190 ], "errorMessage": "expected op.balance by index to match" }, { "pc": [ - 183 + 181 ], "errorMessage": "expected op.balance to match" }, { "pc": [ - 246 + 244 ], "errorMessage": "expected op.min_balance by index to match" }, { "pc": [ - 237 + 235 ], "errorMessage": "expected op.min_balance to match" }, { "pc": [ - 166, - 220, - 273, - 301, - 330, - 359, - 388, - 417, - 446, - 475, - 504, - 533, - 562, - 598, - 627 + 164, + 218, + 271, + 299, + 328, + 357, + 386, + 415, + 444, + 473, + 502, + 531, + 560, + 596, + 625 ], "errorMessage": "expected value by index to match" } @@ -458,19 +446,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1ZjViNDNlNCAweDczZGM5M2M3IDB4NTYyNmRmZWIgMHhkYzhhMjViZiAweDE5OGViZDhjIDB4MjMwMWFiMjYgMHg5ZjY4ZmNhNiAweGE5NzVjMmQxIDB4ZDFlMDQ4MDEgMHhiNjk2NmJlNSAweDE5NWQ1NDE4IDB4NmFkYWUzZjEgMHhkZjhjZmVlNSAweDZhZDcwZDIxIDB4MTczNWZkMjIgLy8gbWV0aG9kICJ2ZXJpZnlfYWNjdF9iYWxhbmNlKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfYXV0aF9hZGRyKGFjY291bnQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyhhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyhhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGFjY291bnQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYWNjdF9iYWxhbmNlIHZlcmlmeV9hY2N0X21pbl9iYWxhbmNlIHZlcmlmeV9hY2N0X2F1dGhfYWRkciB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludCB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4gdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzIHZlcmlmeV9hY2N0X3RvdGFsX2JveGVzIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyB2ZXJpZnlfYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUgdmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQgdmVyaWZ5X2FjY3RfbGFzdF9wcm9wb3NlZAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIyOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2JhbGFuY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKGEpCiAgICBkdXAKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLmJhbGFuY2UsICJleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2giCiAgICBkaWcgMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIEFjY291bnQgYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLmJhbGFuY2UoYSksICJleHBlY3RlZCBvcC5iYWxhbmNlIHRvIG1hdGNoIgogICAgc3dhcAogICAgYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMy0zNQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MAogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9taW5fYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NAogICAgLy8gYXNzZXJ0IHZhbHVlID09IGEubWluX2JhbGFuY2UsICJleHBlY3RlZCBBY2NvdW50IG1pbl9iYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IG1pbl9iYWxhbmNlIHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoYSksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0Ni00OAogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5taW5fYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLm1pbl9iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgbWluX2JhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLm1pbl9iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9hdXRoX2FkZHJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9hdXRoX2FkZHIoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTQKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RBdXRoQWRkcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV91aW50KGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzAtNzIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODAtODIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsRXh0cmFBcHBQYWdlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTAKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19jcmVhdGVkKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5OAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDUKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwNi0xMDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYm94ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYm94ZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYm94ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzEKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYm94X2J5dGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hCeXRlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0SW5jZW50aXZlRWxpZ2libGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0SW5jZW50aXZlRWxpZ2libGUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgcHVzaGludCAwIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ3CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2xhc3RfaGVhcnRiZWF0KGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2xhc3RfaGVhcnRiZWF0KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RMYXN0SGVhcnRiZWF0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfbGFzdF9wcm9wb3NlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTUKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RMYXN0UHJvcG9zZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2xhc3RfcHJvcG9zZWQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIDB4ZGY4Y2ZlZTUgMHg2YWQ3MGQyMSAweDE3MzVmZDIyIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZShhY2NvdW50KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkKGFjY291bnQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2FjY3RfYmFsYW5jZSB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZSB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZCB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcyB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMgdmVyaWZ5X2FjY3RfaW5jZW50aXZlX2VsaWdpYmxlIHZlcmlmeV9hY2N0X2xhc3RfaGVhcnRiZWF0IHZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYS5iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBiYWxhbmNlIHRvIG1hdGNoIgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCIKICAgIHN3YXAKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMtMzUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AuYmFsYW5jZSgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKSwgImV4cGVjdGVkIG9wLmJhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9taW5fYmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X21pbl9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDAKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbWluX2JhbGFuY2UoYSkKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X21pbl9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLm1pbl9iYWxhbmNlKGEpLCAiZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2giCiAgICBzd2FwCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYXV0aF9hZGRyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfYXV0aF9hZGRyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYXV0aF9hZGRyKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgwLTgyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcygKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkwCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA1CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDYtMTA4CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEwCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHMoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTE2CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2Fzc2V0cyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIzCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjYKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMxCiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhhKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hY2N0X2luY2VudGl2ZV9lbGlnaWJsZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfaW5jZW50aXZlX2VsaWdpYmxlKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9pbmNlbnRpdmVfZWxpZ2libGUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEluY2VudGl2ZUVsaWdpYmxlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDIKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbGFzdF9oZWFydGJlYXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X2hlYXJ0YmVhdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoYSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdEhlYXJ0YmVhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9oZWFydGJlYXQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RIZWFydGJlYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2xhc3RfcHJvcG9zZWRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYWNjdF9sYXN0X3Byb3Bvc2VkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9sYXN0X3Byb3Bvc2VkKGEpCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdExhc3RQcm9wb3NlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfbGFzdF9wcm9wb3NlZChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TGFzdFByb3Bvc2VkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTgKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAsAQQB3AJMAsADNAOoBBwEkAUEBXgF7AZgBvAHZADEZFDEYFBBEIkM2GgEXwBxJcwA2GgEXcwBLA08CEkQSREsBcwBESwESRExgSwESRDYaARdgSwESRBYoTFCwIkM2GgEXwBxJcwE2GgEXcwFLA08CEkQSREsBcwFESwESREx4SwESRDYaARd4SwESRBYoTFCwIkM2GgEXwBxzAjYaARdzAksDTwISRBJEKExQsCJDNhoBF8AccwM2GgEXcwNLA08CEkQSRBYoTFCwIkM2GgEXwBxzBDYaARdzBEsDTwISRBJEFihMULAiQzYaARfAHHMFNhoBF3MFSwNPAhJEEkQWKExQsCJDNhoBF8AccwY2GgEXcwZLA08CEkQSRBYoTFCwIkM2GgEXwBxzBzYaARdzB0sDTwISRBJEFihMULAiQzYaARfAHHMINhoBF3MISwNPAhJEEkQWKExQsCJDNhoBF8Accwk2GgEXcwlLA08CEkQSRBYoTFCwIkM2GgEXwBxzCjYaARdzCksDTwISRBJEFihMULAiQzYaARfAHHMLNhoBF3MLSwNPAhJEEkQWKExQsCJDNhoBF8Accww2GgEXcwxLA08CEkQSRIABAIEATwJUKExQsCJDNhoBF8Accw42GgEXcw5LA08CEkQSRBYoTFCwIkM2GgEXwBxzDTYaARdzDUsDTwISRBJEFihMULAiQw==", + "approval": "CyABASYBBBUffHUxG0EAeDEZFEQxGESCDwRfW0PkBHPck8cEVibf6wTciiW/BBmOvYwEIwGrJgSfaPymBKl1wtEE0eBIAQS2lmvlBBldVBgEatrj8QTfjP7lBGrXDSEEFzX9IjYaAI4PAAkAPwB1AJEArgDLAOgBBQEiAT8BXAF5AZYBugHXADEZFDEYFBBDNhoBF8AcSXMANhoBF3MASwNPAhJEEkRLAXMAREsBEkRMYEsBEkQ2GgEXYEsBEkQWKExQsCJDNhoBF8AcSXMBNhoBF3MBSwNPAhJEEkRLAXMBREsBEkRMeEsBEkQ2GgEXeEsBEkQWKExQsCJDNhoBF8AccwI2GgEXcwJLA08CEkQSRChMULAiQzYaARfAHHMDNhoBF3MDSwNPAhJEEkQWKExQsCJDNhoBF8AccwQ2GgEXcwRLA08CEkQSRBYoTFCwIkM2GgEXwBxzBTYaARdzBUsDTwISRBJEFihMULAiQzYaARfAHHMGNhoBF3MGSwNPAhJEEkQWKExQsCJDNhoBF8Accwc2GgEXcwdLA08CEkQSRBYoTFCwIkM2GgEXwBxzCDYaARdzCEsDTwISRBJEFihMULAiQzYaARfAHHMJNhoBF3MJSwNPAhJEEkQWKExQsCJDNhoBF8Accwo2GgEXcwpLA08CEkQSRBYoTFCwIkM2GgEXwBxzCzYaARdzC0sDTwISRBJEFihMULAiQzYaARfAHHMMNhoBF3MMSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARfAHHMONhoBF3MOSwNPAhJEEkQWKExQsCJDNhoBF8Accw02GgEXcw1LA08CEkQSRBYoTFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal b/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal index 56f7dba8..310f3634 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@16 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xa997a187 0x4db8aa41 0x0c1f56a7 0xafddb088 0x93a852e1 0x36996451 0x3920a57b // method "verify_get_bytes(byte[])byte[]", method "verify_get_uint64(byte[])uint64", method "verify_get_ex_bytes(uint64,byte[])(byte[],bool)", method "verify_get_ex_uint64(uint64,byte[])(uint64,bool)", method "verify_delete(byte[])void", method "verify_put_uint64(byte[],uint64)void", method "verify_put_bytes(byte[],byte[])void" @@ -25,8 +25,6 @@ main___algopy_default_create@16: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json index 17af0c8f..397cf47b 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json @@ -212,20 +212,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 22 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 90 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -234,19 +221,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhOTk3YTE4NyAweDRkYjhhYTQxIDB4MGMxZjU2YTcgMHhhZmRkYjA4OCAweDkzYTg1MmUxIDB4MzY5OTY0NTEgMHgzOTIwYTU3YiAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF91aW50NjQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyh1aW50NjQsYnl0ZVtdKShieXRlW10sYm9vbCkiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KHVpbnQ2NCxieXRlW10pKHVpbnQ2NCxib29sKSIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9nZXRfYnl0ZXMgdmVyaWZ5X2dldF91aW50NjQgdmVyaWZ5X2dldF9leF9ieXRlcyB2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCB2ZXJpZnlfZGVsZXRlIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X2dldF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NTkKICAgIC8vIHZhbHVlID0gb3AuQXBwR2xvYmFsLmdldF9ieXRlcyhhKQogICAgYXBwX2dsb2JhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjQKICAgIC8vIHZhbHVlID0gb3AuQXBwR2xvYmFsLmdldF91aW50NjQoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2V4X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY5CiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF9ieXRlcyhhLCBiKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NzMKICAgIC8vIHJldHVybiBvcC5BcHBHbG9iYWwuZ2V0X2V4X3VpbnQ2NChhLCBiKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X2RlbGV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9kZWxldGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NzcKICAgIC8vIG9wLkFwcEdsb2JhbC5kZWxldGUoYSkKICAgIGFwcF9nbG9iYWxfZGVsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9wdXRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODEKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9wdXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ4NQogICAgLy8gb3AuQXBwR2xvYmFsLnB1dChhLCBiKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ1CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDBjMWY1NmE3IDB4YWZkZGIwODggMHg5M2E4NTJlMSAweDM2OTk2NDUxIDB4MzkyMGE1N2IgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXModWludDY0LGJ5dGVbXSkoYnl0ZVtdLGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NCh1aW50NjQsYnl0ZVtdKSh1aW50NjQsYm9vbCkiLCBtZXRob2QgInZlcmlmeV9kZWxldGUoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU5CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY0CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBhcHBfZ2xvYmFsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2OQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfYnl0ZXMoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MDAwMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDczCiAgICAvLyByZXR1cm4gb3AuQXBwR2xvYmFsLmdldF9leF91aW50NjQoYSwgYikKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDc3CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgxCiAgICAvLyBvcC5BcHBHbG9iYWwucHV0KGEsIGIpCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0ODUKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACwAgAC4AVgBvAHgAhQAxGRQxGBQQRCJDNhoBVwIAZEkVFlcGAkxQKExQsCJDNhoBVwIAZBYoTFCwIkM2GgEXNhoCVwIAZUsBFRZXBgJPAlApI08DVIACAANMUExQKExQsCJDNhoBFzYaAlcCAGVMFikjTwNUUChMULAiQzYaAVcCAGkiQzYaAVcCADYaAhdnIkM2GgFXAgA2GgJXAgBnIkM=", + "approval": "CyACAQAmAgQVH3x1AQAxG0EAQDEZFEQxGESCBwSpl6GHBE24qkEEDB9WpwSv3bCIBJOoUuEENplkUQQ5IKV7NhoAjgcACQAeACwAVABtAHYAgwAxGRQxGBQQQzYaAVcCAGRJFRZXBgJMUChMULAiQzYaAVcCAGQWKExQsCJDNhoBFzYaAlcCAGVLARUWVwYCTwJQKSNPA1SAAgADTFBMUChMULAiQzYaARc2GgJXAgBlTBYpI08DVFAoTFCwIkM2GgFXAgBpIkM2GgFXAgA2GgIXZyJDNhoBVwIANhoCVwIAZyJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal b/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal b/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal index 23c0a8fa..0c9d3eda 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal @@ -11,7 +11,7 @@ main: pushbytes "global_uint64" // tests/artifacts/StateOps/contract.py:430 // UInt64(2), - pushint 2 // 2 + pushint 2 // tests/artifacts/StateOps/contract.py:429-432 // self.global_uint64 = GlobalState( // UInt64(2), @@ -33,7 +33,7 @@ main: // tests/artifacts/StateOps/contract.py:437 // self.global_uint64_explicit = algopy.UInt64(2) pushbytes "global_uint64_explicit" - pushint 2 // 2 + pushint 2 app_global_put // tests/artifacts/StateOps/contract.py:438 // self.global_bytes_explicit = algopy.Bytes(b"dummy_bytes") @@ -70,6 +70,4 @@ main_after_if_else@2: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return diff --git a/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json b/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json index afcf5309..3c483be6 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json @@ -68,14 +68,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 187 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -84,19 +77,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyIC8vIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjktNDMyCiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjQgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBVSW50NjQoMiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfdWludDY0IiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM1CiAgICAvLyBrZXk9Imdsb2JhbF9ieXRlcyIsCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzQKICAgIC8vIEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKSwKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMzLTQzNgogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCA9IGFsZ29weS5VSW50NjQoMikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9ieXRlc19leHBsaWNpdCIKICAgIGJ5dGVjXzAgLy8gMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MAogICAgLy8gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzktNDQxCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBieXRlY18xIC8vIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQyCiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0ID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI3CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDMxCiAgICAvLyBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gVUludDY0KDIpLAogICAgcHVzaGludCAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI5LTQzMgogICAgLy8gc2VsZi5nbG9iYWxfdWludDY0ID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgVUludDY0KDIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX3VpbnQ2NCIsCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzNQogICAgLy8ga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM0CiAgICAvLyBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICBieXRlY18wIC8vIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzMy00MzYKICAgIC8vIHNlbGYuZ2xvYmFsX2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgQnl0ZXMoYiJkdW1teV9ieXRlcyIpLAogICAgLy8gICAgIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIC8vICkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmdsb2JhbF91aW50NjRfZXhwbGljaXQgPSBhbGdvcHkuVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjRfZXhwbGljaXQiCiAgICBwdXNoaW50IDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM4CiAgICAvLyBzZWxmLmdsb2JhbF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5CeXRlcyhiImR1bW15X2J5dGVzIikKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBwdXNoYnl0ZXMgImdsb2JhbF9hcmM0X2J5dGVzIgogICAgYnl0ZWNfMSAvLyAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzOS00NDEKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gc2VsZi5nbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDAKICAgIC8vIGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcyhiImR1bW15X2FyYzRfYnl0ZXMiKSwga2V5PSJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDIKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjcKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEESBAUM=", + "approval": "CyYCC2R1bW15X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlczEYQACJgA1nbG9iYWxfdWludDY0gQJngAxnbG9iYWxfYnl0ZXMoZ4AWZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdIECZ4AVZ2xvYmFsX2J5dGVzX2V4cGxpY2l0KGeAEWdsb2JhbF9hcmM0X2J5dGVzKWeAGmdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0KWcxGxREMRkUMRgUEEM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal b/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal b/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal index ac840c75..24800c47 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal @@ -18,7 +18,7 @@ main_switch_case_next@6: // class StateAppLocalContract(ARC4Contract): txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xa88302fe 0x49b7ddf9 0xc078bead 0xa52f992b 0x8c56ad90 0x4c7ad823 0xcaa7b864 0x24f9f085 // method "verify_get_bytes(address,byte[])byte[]", method "verify_get_uint64(address,byte[])uint64", method "verify_get_ex_bytes(address,uint64,byte[])byte[]", method "verify_get_ex_uint64(address,uint64,byte[])uint64", method "verify_delete(address,byte[])void", method "verify_exists(address,byte[])bool", method "verify_put_uint64(address,byte[],uint64)void", method "verify_put_bytes(address,byte[],byte[])void" @@ -34,7 +34,7 @@ main_opt_in_route@5: == txn ApplicationID && - assert // OnCompletion must be OptIn && can only call when not creating + assert b opt_in main___algopy_default_create@19: @@ -43,8 +43,6 @@ main___algopy_default_create@19: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -53,13 +51,13 @@ opt_in: // tests/artifacts/StateOps/contract.py:386 // self.local_bytes[Global.creator_address] = Bytes(b"dummy_bytes") global CreatorAddress - pushbytess "local_bytes" 0x64756d6d795f6279746573 // "local_bytes", 0x64756d6d795f6279746573 + pushbytess "local_bytes" 0x64756d6d795f6279746573 app_local_put // tests/artifacts/StateOps/contract.py:387 // self.local_uint64[Global.creator_address] = UInt64(999) global CreatorAddress pushbytes "local_uint64" - pushint 999 // 999 + pushint 999 app_local_put // tests/artifacts/StateOps/contract.py:384 // @arc4.abimethod(allow_actions=["OptIn"]) diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json index f7f20ffd..dae92488 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json @@ -281,26 +281,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 33 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 119 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 108 - ], - "errorMessage": "OnCompletion must be OptIn && can only call when not creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -309,19 +290,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhhODgzMDJmZSAweDQ5YjdkZGY5IDB4YzA3OGJlYWQgMHhhNTJmOTkyYiAweDhjNTZhZDkwIDB4NGM3YWQ4MjMgMHhjYWE3Yjg2NCAweDI0ZjlmMDg1IC8vIG1ldGhvZCAidmVyaWZ5X2dldF9ieXRlcyhhZGRyZXNzLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyhhZGRyZXNzLHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhZGRyZXNzLHVpbnQ2NCxieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfZGVsZXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgInZlcmlmeV9leGlzdHMoYWRkcmVzcyxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3B1dF91aW50NjQoYWRkcmVzcyxieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfYnl0ZXMoYWRkcmVzcyxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfZ2V0X2J5dGVzIHZlcmlmeV9nZXRfdWludDY0IHZlcmlmeV9nZXRfZXhfYnl0ZXMgdmVyaWZ5X2dldF9leF91aW50NjQgdmVyaWZ5X2RlbGV0ZSB2ZXJpZnlfZXhpc3RzIHZlcmlmeV9wdXRfdWludDY0IHZlcmlmeV9wdXRfYnl0ZXMKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0Lm9wdF9pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODYKICAgIC8vIHNlbGYubG9jYWxfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBCeXRlcyhiImR1bW15X2J5dGVzIikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzcyAibG9jYWxfYnl0ZXMiIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MyAvLyAibG9jYWxfYnl0ZXMiLCAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODcKICAgIC8vIHNlbGYubG9jYWxfdWludDY0W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gVUludDY0KDk5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5OSAvLyA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX25leHRANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4YTg4MzAyZmUgMHg0OWI3ZGRmOSAweGMwNzhiZWFkIDB4YTUyZjk5MmIgMHg4YzU2YWQ5MCAweDRjN2FkODIzIDB4Y2FhN2I4NjQgMHgyNGY5ZjA4NSAvLyBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYWRkcmVzcyxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfZ2V0X3VpbnQ2NChhZGRyZXNzLGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF91aW50NjQoYWRkcmVzcyx1aW50NjQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFkZHJlc3MsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFkZHJlc3MsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2dldF9ieXRlcyB2ZXJpZnlfZ2V0X3VpbnQ2NCB2ZXJpZnlfZ2V0X2V4X2J5dGVzIHZlcmlmeV9nZXRfZXhfdWludDY0IHZlcmlmeV9kZWxldGUgdmVyaWZ5X2V4aXN0cyB2ZXJpZnlfcHV0X3VpbnQ2NCB2ZXJpZnlfcHV0X2J5dGVzCiAgICBlcnIKCm1haW5fb3B0X2luX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBvcHRfaW4KCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg3CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OTkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzkxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X2J5dGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdmFsdWUsIF92YWwgPSBvcC5BcHBMb2NhbC5nZXRfZXhfYnl0ZXMoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9nZXRfZXhfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA2CiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDExCiAgICAvLyBvcC5BcHBMb2NhbC5kZWxldGUoYSwgYikKICAgIGFwcF9sb2NhbF9kZWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDI0CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEkAYQByAI8ApQCxAMwA3AAxGSISMRgQREIACjEZFDEYFBBEIkMyCYICC2xvY2FsX2J5dGVzC2R1bW15X2J5dGVzZjIJgAxsb2NhbF91aW50NjSB5wdmIkM2GgE2GgJXAgBiSRUWVwYCTFAoTFCwIkM2GgE2GgJXAgBiFihMULAiQzYaATYaAhc2GgNXAgBjSEkVFlcGAkxQKExQsCJDNhoBNhoCFzYaA1cCAGNIFihMULAiQzYaATYaAlcCAGgiQzYaATYaAlcCACNMY0UBgAEAI08CVChMULAiQzYaATYaAlcCADYaAxdmIkM2GgE2GgJXAgA2GgNXAgBmIkM=", + "approval": "CyACAQAmAQQVH3x1MRtBAF+ABDDG1Yo2GgCOAQBHMRkURDEYRIIIBKiDAv4ESbfd+QTAeL6tBKUvmSsEjFatkARMetgjBMqnuGQEJPnwhTYaAI4IAEcAXwBwAI0AowCvAMoA2gAxGSISMRgQREIACDEZFDEYFBBDMgmCAgtsb2NhbF9ieXRlcwtkdW1teV9ieXRlc2YyCYAMbG9jYWxfdWludDY0gecHZiJDNhoBNhoCVwIAYkkVFlcGAkxQKExQsCJDNhoBNhoCVwIAYhYoTFCwIkM2GgE2GgIXNhoDVwIAY0hJFRZXBgJMUChMULAiQzYaATYaAhc2GgNXAgBjSBYoTFCwIkM2GgE2GgJXAgBoIkM2GgE2GgJXAgAjTGNFAYABACNPAlQoTFCwIkM2GgE2GgJXAgA2GgMXZiJDNhoBNhoCVwIANhoDVwIAZiJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal b/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal b/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal index b3b750d5..29b64dfb 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal @@ -20,7 +20,7 @@ main_opt_in_route@5: == txn ApplicationID && - assert // OnCompletion must be OptIn && can only call when not creating + assert b opt_in main___algopy_default_create@7: @@ -29,8 +29,6 @@ main___algopy_default_create@7: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return @@ -39,13 +37,13 @@ opt_in: // tests/artifacts/StateOps/contract.py:365 // self.local_bytes[Global.creator_address] = Bytes(b"dummy_bytes_from_external_contract") global CreatorAddress - pushbytess "local_bytes" 0x64756d6d795f62797465735f66726f6d5f65787465726e616c5f636f6e7472616374 // "local_bytes", 0x64756d6d795f62797465735f66726f6d5f65787465726e616c5f636f6e7472616374 + pushbytess "local_bytes" 0x64756d6d795f62797465735f66726f6d5f65787465726e616c5f636f6e7472616374 app_local_put // tests/artifacts/StateOps/contract.py:366 // self.local_uint64[Global.creator_address] = UInt64(99) global CreatorAddress pushbytes "local_uint64" - pushint 99 // 99 + pushint 99 app_local_put // tests/artifacts/StateOps/contract.py:367 // self.local_arc4_bytes[Global.creator_address] = algopy.arc4.DynamicBytes( @@ -54,9 +52,9 @@ opt_in: // self.local_arc4_bytes[Global.creator_address] = algopy.arc4.DynamicBytes( // b"dummy_arc4_bytes" // ) - pushbytess "local_arc4_bytes" 0x001064756d6d795f617263345f6279746573 // "local_arc4_bytes", 0x001064756d6d795f617263345f6279746573 + pushbytess "local_arc4_bytes" 0x001064756d6d795f617263345f6279746573 app_local_put // tests/artifacts/StateOps/contract.py:363 // @arc4.abimethod(allow_actions=["OptIn"]) - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json index 0aa76cfa..f102befd 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json @@ -70,20 +70,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 39 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 28 - ], - "errorMessage": "OnCompletion must be OptIn && can only call when not creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -92,19 +79,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE9wdEluICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgb3B0X2luCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDc6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsRXhDb250cmFjdC5vcHRfaW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY1CiAgICAvLyBzZWxmLmxvY2FsX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gQnl0ZXMoYiJkdW1teV9ieXRlc19mcm9tX2V4dGVybmFsX2NvbnRyYWN0IikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzcyAibG9jYWxfYnl0ZXMiIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MzVmNjY3MjZmNmQ1ZjY1Nzg3NDY1NzI2ZTYxNmM1ZjYzNmY2ZTc0NzI2MTYzNzQgLy8gImxvY2FsX2J5dGVzIiwgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczNWY2NjcyNmY2ZDVmNjU3ODc0NjU3MjZlNjE2YzVmNjM2ZjZlNzQ3MjYxNjM3NAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gc2VsZi5sb2NhbF91aW50NjRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBVSW50NjQoOTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgcHVzaGludCA5OSAvLyA5OQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NwogICAgLy8gc2VsZi5sb2NhbF9hcmM0X2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3LTM2OQogICAgLy8gc2VsZi5sb2NhbF9hcmM0X2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKAogICAgLy8gICAgIGIiZHVtbXlfYXJjNF9ieXRlcyIKICAgIC8vICkKICAgIHB1c2hieXRlc3MgImxvY2FsX2FyYzRfYnl0ZXMiIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczIC8vICJsb2NhbF9hcmM0X2J5dGVzIiwgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3CiAgICBwdXNoYnl0ZXMgMHgzMGM2ZDU4YSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDUKICAgIGVycgoKbWFpbl9vcHRfaW5fcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMSAvLyBPcHRJbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIG9wdF9pbgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIHB1c2hieXRlc3MgImxvY2FsX2J5dGVzIiAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzM1ZjY2NzI2ZjZkNWY2NTc4NzQ2NTcyNmU2MTZjNWY2MzZmNmU3NDcyNjE2Mzc0CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OSkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgcHVzaGJ5dGVzICJsb2NhbF91aW50NjQiCiAgICBwdXNoaW50IDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICAvLyAgICAgYiJkdW1teV9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYXJjNF9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAsxGRQxGBQQRIEBQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=", + "approval": "CzEbQQAagAQwxtWKNhoAjgEAAQAxGYEBEjEYEERCAAgxGRQxGBQQQzIJggILbG9jYWxfYnl0ZXMiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdGYyCYAMbG9jYWxfdWludDY0gWNmMgmCAhBsb2NhbF9hcmM0X2J5dGVzEgAQZHVtbXlfYXJjNF9ieXRlc2aBAUM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal b/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal b/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal index 009145db..8f53ee16 100644 --- a/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@16 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xb9d13c1b 0xe5c3c889 0xee4e7b2a 0x7fa234cb 0x19f77439 0x92c572aa 0xae9c6efb 0xe36ed705 0x8c66a842 // method "verify_app_params_get_approval_program(uint64)byte[]", method "verify_app_params_get_clear_state_program(uint64)byte[]", method "verify_app_params_get_global_num_uint(uint64)uint64", method "verify_app_params_get_global_num_byte_slice(uint64)uint64", method "verify_app_params_get_local_num_uint(uint64)uint64", method "verify_app_params_get_local_num_byte_slice(uint64)uint64", method "verify_app_params_get_extra_program_pages(uint64)uint64", method "verify_app_params_get_creator(uint64)address", method "verify_app_params_get_address(uint64)address" @@ -25,8 +25,6 @@ main___algopy_default_create@16: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return diff --git a/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json b/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json index 46efe37c..d55655ff 100644 --- a/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json @@ -228,32 +228,6 @@ "sourceInfo": { "approval": { "sourceInfo": [ - { - "pc": [ - 19 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 101 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 123, - 157, - 191, - 218, - 245, - 272, - 299, - 326, - 352 - ], - "errorMessage": "expected exists by index to match" - }, { "pc": [ 121, @@ -266,6 +240,20 @@ 324, 350 ], + "errorMessage": "expected exists by index to match" + }, + { + "pc": [ + 119, + 153, + 187, + 214, + 241, + 268, + 295, + 322, + 348 + ], "errorMessage": "expected value by index to match" } ], @@ -277,19 +265,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGI5ZDEzYzFiIDB4ZTVjM2M4ODkgMHhlZTRlN2IyYSAweDdmYTIzNGNiIDB4MTlmNzc0MzkgMHg5MmM1NzJhYSAweGFlOWM2ZWZiIDB4ZTM2ZWQ3MDUgMHg4YzY2YTg0MiAvLyBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTY6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfYXBwcm92YWxfcHJvZ3JhbShhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQXBwcm92YWxQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfYXBwcm92YWxfcHJvZ3JhbShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjc4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY2xlYXJfc3RhdGVfcHJvZ3JhbShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fdWludChhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fdWludChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fYnl0ZV9zbGljZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9sb2NhbF9udW1fdWludChhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX2J5dGVfc2xpY2UoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9leHRyYV9wcm9ncmFtX3BhZ2VzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NyZWF0b3IoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfYWRkcmVzcyhhKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzIKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHhiOWQxM2MxYiAweGU1YzNjODg5IDB4ZWU0ZTdiMmEgMHg3ZmEyMzRjYiAweDE5Zjc3NDM5IDB4OTJjNTcyYWEgMHhhZTljNmVmYiAweGUzNmVkNzA1IDB4OGM2NmE4NDIgLy8gbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcih1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50IHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZSB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvciB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3OAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDbGVhclN0YXRlUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX3VpbnQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV91aW50KF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZXh0cmFfcHJvZ3JhbV9wYWdlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFwcFBhcmFtc0dldC5hcHBfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FkZHJlc3MoYSkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAsALQBPAGoAhQCgALsA1gDwADEZFDEYFBBEIkM2GgEXcgA2GgEXcgBLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3IBNhoBF3IBSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyAjYaARdyAksDTwISRBJEFihMULAiQzYaARdyAzYaARdyA0sDTwISRBJEFihMULAiQzYaARdyBDYaARdyBEsDTwISRBJEFihMULAiQzYaARdyBTYaARdyBUsDTwISRBJEFihMULAiQzYaARdyBjYaARdyBksDTwISRBJEFihMULAiQzYaARdyBzYaARdyB0sDTwISRBJEKExQsCJDNhoBF3IINhoBF3IISwNPAhJEEkQoTFCwIkM=", + "approval": "CyABASYBBBUffHUxG0EATjEZFEQxGESCCQS50TwbBOXDyIkE7k57KgR/ojTLBBn3dDkEksVyqgSunG77BONu1wUEjGaoQjYaAI4JAAkAKwBNAGgAgwCeALkA1ADuADEZFDEYFBBDNhoBF3IANhoBF3IASwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdyATYaARdyAUsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcgI2GgEXcgJLA08CEkQSRBYoTFCwIkM2GgEXcgM2GgEXcgNLA08CEkQSRBYoTFCwIkM2GgEXcgQ2GgEXcgRLA08CEkQSRBYoTFCwIkM2GgEXcgU2GgEXcgVLA08CEkQSRBYoTFCwIkM2GgEXcgY2GgEXcgZLA08CEkQSRBYoTFCwIkM2GgEXcgc2GgEXcgdLA08CEkQSRChMULAiQzYaARdyCDYaARdyCEsDTwISRBJEKExQsCJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal b/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal b/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal index 7b3aae9b..184ceeb9 100644 --- a/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal @@ -10,7 +10,7 @@ main: bz main___algopy_default_create@9 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0x8f5235b4 0xde7a39f6 // method "verify_asset_holding_get(address,uint64)uint64", method "verify_asset_frozen_get(address,uint64)bool" @@ -24,8 +24,6 @@ main___algopy_default_create@9: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return @@ -47,7 +45,7 @@ verify_asset_holding_get: swap concat log - pushint 1 // 1 + pushint 1 return @@ -65,12 +63,12 @@ verify_asset_frozen_get: // tests/artifacts/StateOps/contract.py:168 // @arc4.abimethod() pushbytes 0x00 - pushint 0 // 0 + pushint 0 uncover 2 setbit bytec_0 // 0x151f7c75 swap concat log - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json b/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json index b7aacb08..d23f1e43 100644 --- a/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json @@ -88,20 +88,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 16 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 49 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -110,19 +97,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4ZjUyMzViNCAweGRlN2EzOWY2IC8vIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0KGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYWRkcmVzcyx1aW50NjQpYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV9hc3NldF9ob2xkaW5nX2dldCB2ZXJpZnlfYXNzZXRfZnJvemVuX2dldAogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0LnZlcmlmeV9hc3NldF9ob2xkaW5nX2dldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9ob2xkaW5nX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY1CiAgICAvLyBiYWxhbmNlLCBfdmFsID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2JhbGFuY2UoYSwgYikKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0LnZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gZnJvemVuLCBfdmFsID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2Zyb3plbihhLCBiKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRGcm96ZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4OGY1MjM1YjQgMHhkZTdhMzlmNiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGFkZHJlc3MsdWludDY0KWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQgdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA5OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gYmFsYW5jZSwgX3ZhbCA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTcwCiAgICAvLyBmcm96ZW4sIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfZnJvemVuKGEsIGIpCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEZyb3plbgogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAMAB4AMRkUMRgUEESBAUM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD", + "approval": "CyYBBBUffHUxG0EAHTEZFEQxGESCAgSPUjW0BN56OfY2GgCOAgAJABsAMRkUMRgUEEM2GgE2GgIXcABIFihMULCBAUM2GgE2GgIXcAFIgAEAgQBPAlQoTFCwgQFD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal b/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal b/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal index a44a140b..e0d62ed9 100644 --- a/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal +++ b/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal @@ -11,7 +11,7 @@ main: bz main___algopy_default_create@19 txn OnCompletion ! - assert // OnCompletion must be NoOp + assert txn ApplicationID assert pushbytess 0xf05da7a4 0xc0e9c315 0xd8528273 0xf4468ad9 0x229d12f7 0xdf534f7b 0xe050b5a9 0x8b2a2d58 0xee15c4f7 0x157544ff 0x10492c07 0x5229fa37 // method "verify_asset_params_get_total(uint64)uint64", method "verify_asset_params_get_decimals(uint64)uint64", method "verify_asset_params_get_default_frozen(uint64)bool", method "verify_asset_params_get_unit_name(uint64)byte[]", method "verify_asset_params_get_name(uint64)byte[]", method "verify_asset_params_get_url(uint64)byte[]", method "verify_asset_params_get_metadata_hash(uint64)byte[]", method "verify_asset_params_get_manager(uint64)address", method "verify_asset_params_get_reserve(uint64)address", method "verify_asset_params_get_freeze(uint64)address", method "verify_asset_params_get_clawback(uint64)address", method "verify_asset_params_get_creator(uint64)address" @@ -25,8 +25,6 @@ main___algopy_default_create@19: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - intc_0 // 1 return @@ -133,7 +131,7 @@ verify_asset_params_get_default_frozen: // tests/artifacts/StateOps/contract.py:191 // @arc4.abimethod() pushbytes 0x00 - pushint 0 // 0 + pushint 0 uncover 2 setbit bytec_0 // 0x151f7c75 diff --git a/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json b/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json index 17d8ff82..7fb112cd 100644 --- a/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json +++ b/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json @@ -291,35 +291,6 @@ "sourceInfo": { "approval": { "sourceInfo": [ - { - "pc": [ - 19 - ], - "errorMessage": "OnCompletion must be NoOp" - }, - { - "pc": [ - 122 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 144, - 171, - 198, - 232, - 266, - 300, - 334, - 368, - 394, - 420, - 446, - 472 - ], - "errorMessage": "expected exists by index to match" - }, { "pc": [ 142, @@ -335,6 +306,23 @@ 444, 470 ], + "errorMessage": "expected exists by index to match" + }, + { + "pc": [ + 140, + 167, + 194, + 228, + 262, + 296, + 330, + 364, + 390, + 416, + 442, + 468 + ], "errorMessage": "expected value by index to match" } ], @@ -346,19 +334,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZjA1ZGE3YTQgMHhjMGU5YzMxNSAweGQ4NTI4MjczIDB4ZjQ0NjhhZDkgMHgyMjlkMTJmNyAweGRmNTM0ZjdiIDB4ZTA1MGI1YTkgMHg4YjJhMmQ1OCAweGVlMTVjNGY3IDB4MTU3NTQ0ZmYgMHgxMDQ5MmMwNyAweDUyMjlmYTM3IC8vIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHModWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4odWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoKHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSh1aW50NjQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2sodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IodWludDY0KWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFscyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxOToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3RvdGFsKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlY2ltYWxzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWZhdWx0X2Zyb3plbihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIHB1c2hpbnQgMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91bml0X25hbWUoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDIKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91bml0X25hbWUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdXJsKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxOQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2hbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjUKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tZXRhZGF0YV9oYXNoKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWV0YWRhdGFIYXNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21hbmFnZXIoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21hbmFnZXIoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWFuYWdlcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3Jlc2VydmUoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3Jlc2VydmUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZnJlZXplKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUyCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2tbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY2xhd2JhY2soYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzQKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGYwNWRhN2E0IDB4YzBlOWMzMTUgMHhkODUyODI3MyAweGY0NDY4YWQ5IDB4MjI5ZDEyZjcgMHhkZjUzNGY3YiAweGUwNTBiNWE5IDB4OGIyYTJkNTggMHhlZTE1YzRmNyAweDE1NzU0NGZmIDB4MTA0OTJjMDcgMHg1MjI5ZmEzNyAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUodWludDY0KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yKHVpbnQ2NClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4gdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWUgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2ggdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlciB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZSB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yCiAgICBlcnIKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdG90YWwoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVjaW1hbHMoYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlZmF1bHRfZnJvemVuKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBwdXNoaW50IDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwMwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKGEpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTgKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2g6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X21ldGFkYXRhX2hhc2goYSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWV0YWRhdGFfaGFzaChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjMzCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjM1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQyCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldEZyZWV6ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9mcmVlemUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTcKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jbGF3YmFjayhhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY1CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhKQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjY3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAsAJgBBAGMAhQCnAMkA6wEFAR8BOQFTADEZFDEYFBBEIkM2GgEXcQA2GgEXcQBLA08CEkQSRBYoTFCwIkM2GgEXcQE2GgEXcQFLA08CEkQSRBYoTFCwIkM2GgEXcQI2GgEXcQJLA08CEkQSRIABAIEATwJUKExQsCJDNhoBF3EDNhoBF3EDSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBDYaARdxBEsDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQU2GgEXcQVLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EGNhoBF3EGSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBzYaARdxB0sDTwISRBJEKExQsCJDNhoBF3EINhoBF3EISwNPAhJEEkQoTFCwIkM2GgEXcQk2GgEXcQlLA08CEkQSRChMULAiQzYaARdxCjYaARdxCksDTwISRBJEKExQsCJDNhoBF3ELNhoBF3ELSwNPAhJEEkQoTFCwIkM=", + "approval": "CyABASYBBBUffHUxG0EAYzEZFEQxGESCDATwXaekBMDpwxUE2FKCcwT0RorZBCKdEvcE31NPewTgULWpBIsqLVgE7hXE9wQVdUT/BBBJLAcEUin6NzYaAI4MAAkAJAA/AGEAgwClAMcA6QEDAR0BNwFRADEZFDEYFBBDNhoBF3EANhoBF3EASwNPAhJEEkQWKExQsCJDNhoBF3EBNhoBF3EBSwNPAhJEEkQWKExQsCJDNhoBF3ECNhoBF3ECSwNPAhJEEkSAAQCBAE8CVChMULAiQzYaARdxAzYaARdxA0sDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQQ2GgEXcQRLA08CEkQSREkVFlcGAkxQKExQsCJDNhoBF3EFNhoBF3EFSwNPAhJEEkRJFRZXBgJMUChMULAiQzYaARdxBjYaARdxBksDTwISRBJESRUWVwYCTFAoTFCwIkM2GgEXcQc2GgEXcQdLA08CEkQSRChMULAiQzYaARdxCDYaARdxCEsDTwISRBJEKExQsCJDNhoBF3EJNhoBF3EJSwNPAhJEEkQoTFCwIkM2GgEXcQo2GgEXcQpLA08CEkQSRChMULAiQzYaARdxCzYaARdxC0sDTwISRBJEKExQsCJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal b/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal +++ b/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return diff --git a/tests/artifacts/Tuples/data/TuplesContract.approval.teal b/tests/artifacts/Tuples/data/TuplesContract.approval.teal index 70c2effd..780010f2 100644 --- a/tests/artifacts/Tuples/data/TuplesContract.approval.teal +++ b/tests/artifacts/Tuples/data/TuplesContract.approval.teal @@ -19,10 +19,10 @@ main_test_tuple_with_primitive_type_route@3: ! txn ApplicationID && - assert // OnCompletion must be NoOp && can only call when not creating + assert pushbytes 0x151f7c75000000000000000080 log - pushint 1 // 1 + pushint 1 return main___algopy_default_create@5: @@ -31,6 +31,4 @@ main___algopy_default_create@5: txn ApplicationID ! && - assert // OnCompletion must be NoOp && can only call when creating - pushint 1 // 1 return diff --git a/tests/artifacts/Tuples/data/TuplesContract.arc56.json b/tests/artifacts/Tuples/data/TuplesContract.arc56.json index b5ac7c50..839b4e11 100644 --- a/tests/artifacts/Tuples/data/TuplesContract.arc56.json +++ b/tests/artifacts/Tuples/data/TuplesContract.arc56.json @@ -54,20 +54,7 @@ }, "sourceInfo": { "approval": { - "sourceInfo": [ - { - "pc": [ - 53 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when creating" - }, - { - "pc": [ - 26 - ], - "errorMessage": "OnCompletion must be NoOp && can only call when not creating" - } - ], + "sourceInfo": [], "pcOffsetMethod": "none" }, "clear": { @@ -76,19 +63,19 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwMDAwMDAwMDAwMDAwODAKICAgIGxvZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgVHVwbGVzQ29udHJhY3QoQVJDNENvbnRyYWN0LCBhdm1fdmVyc2lvbj0xMSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1CiAgICBwdXNoYnl0ZXMgMHg3MjI5ZDc5YSAvLyBtZXRob2QgInRlc3RfdHVwbGVfd2l0aF9wcmltaXRpdmVfdHlwZSgpKHVpbnQ2NCxib29sKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF90dXBsZV93aXRoX3ByaW1pdGl2ZV90eXBlX3JvdXRlQDMKICAgIGVycgoKbWFpbl90ZXN0X3R1cGxlX3dpdGhfcHJpbWl0aXZlX3R5cGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9UdXBsZXMvY29udHJhY3QucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDAwMDA4MAogICAgbG9nCiAgICBwdXNoaW50IDEKICAgIHJldHVybgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA1OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4K", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBEgQFD", + "approval": "CzEbQQAogARyKdeaNhoAjgEAAQAxGRQxGBBEgA0VH3x1AAAAAAAAAACAsIEBQzEZFDEYFBBD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, - "minor": 3, - "patch": 1 + "minor": 5, + "patch": 0 } }, "events": [], diff --git a/tests/artifacts/Tuples/data/TuplesContract.clear.teal b/tests/artifacts/Tuples/data/TuplesContract.clear.teal index 8843a4b0..75f539be 100644 --- a/tests/artifacts/Tuples/data/TuplesContract.clear.teal +++ b/tests/artifacts/Tuples/data/TuplesContract.clear.teal @@ -3,5 +3,5 @@ // algopy.arc4.ARC4Contract.clear_state_program() -> uint64: main: - pushint 1 // 1 + pushint 1 return From 9a2ab8e3f94e9e7a2a416a94a54cf51b57599089 Mon Sep 17 00:00:00 2001 From: Bobby Lat Date: Mon, 24 Nov 2025 10:51:08 +0800 Subject: [PATCH 2/4] feat: add fixed size variant of bytes as a separate `FixedBytes` type --- docs/coverage.md | 3 +- docs/testing-guide/avm-types.md | 16 + src/_algopy_testing/__init__.py | 3 +- src/_algopy_testing/decorators/arc4.py | 4 +- src/_algopy_testing/primitives/__init__.py | 2 + src/_algopy_testing/primitives/bytes.py | 15 +- src/_algopy_testing/primitives/fixed_bytes.py | 325 +++++++++ src/_algopy_testing/serialize.py | 10 + src/_algopy_testing/utils.py | 2 + src/_algopy_testing/value_generators/avm.py | 15 + src/algopy/__init__.py | 2 + tests/arc4/test_arc4_method_signature.py | 12 +- tests/artifacts/Arc4ABIMethod/contract.py | 7 +- .../data/SignaturesContract.approval.teal | 148 ++-- .../data/SignaturesContract.arc56.json | 8 +- tests/artifacts/PrimitiveOps/contract.py | 5 +- .../data/PrimitiveOpsContract.approval.teal | 15 +- .../data/PrimitiveOpsContract.arc56.json | 8 +- tests/primitives/test_fixed_bytes.py | 666 ++++++++++++++++++ tests/utilities/test_log.py | 8 +- tests/utilities/test_size_of.py | 6 +- tests/value_generators/test_avm.py | 17 +- 22 files changed, 1189 insertions(+), 108 deletions(-) create mode 100644 src/_algopy_testing/primitives/fixed_bytes.py create mode 100644 tests/primitives/test_fixed_bytes.py diff --git a/docs/coverage.md b/docs/coverage.md index 2c3020cc..db774574 100644 --- a/docs/coverage.md +++ b/docs/coverage.md @@ -3,7 +3,7 @@ See which `algorand-python` stubs are implemented by the `algorand-python-testing` library. See the [Concepts](testing-guide/concepts.md#types-of-algopy-stub-implementations) section for more details on the implementation categories. Refer to the [`algorand-python` stubs API](api.md) for the full list of stubs for which the `algorand-python-testing` library provides implementations referenced in the table below. | Name | Implementation type | -|---------------------------------------------|---------------------| +| ------------------------------------------- | ------------------- | | algopy.Account | Emulated | | algopy.Application | Emulated | | algopy.Asset | Emulated | @@ -18,6 +18,7 @@ See which `algorand-python` stubs are implemented by the `algorand-python-testin | algopy.CompiledLogicSig | Mockable | | algopy.Contract | Emulated | | algopy.FixedArray | Native | +| algopy.FixedBytes | Native | | algopy.Global | Emulated | | algopy.GlobalState | Emulated | | algopy.ImmutableArray | Native | diff --git a/docs/testing-guide/avm-types.md b/docs/testing-guide/avm-types.md index 693a309d..110ac7a8 100644 --- a/docs/testing-guide/avm-types.md +++ b/docs/testing-guide/avm-types.md @@ -50,6 +50,22 @@ random_bytes = context.any.bytes() random_bytes = context.any.bytes(length=32) ``` +## FixedBytes + +```{testcode} +import typing + +# Direct instantiation +bytes_value = algopy.FixedBytes[typing.Literal[16]](b"Hello, Algorand!") + + +# Instantiate test context +... + +# Generate random byte sequences of length 32 +random_bytes = context.any.fixed_bytes(algopy.FixedBytes[typing.Literal[32]]) +``` + ## String ```{testcode} diff --git a/src/_algopy_testing/__init__.py b/src/_algopy_testing/__init__.py index f98ea8b1..ffe3bbaf 100644 --- a/src/_algopy_testing/__init__.py +++ b/src/_algopy_testing/__init__.py @@ -19,7 +19,7 @@ uenumerate, urange, ) -from _algopy_testing.primitives import BigUInt, Bytes, String, UInt64 +from _algopy_testing.primitives import BigUInt, Bytes, FixedBytes, String, UInt64 from _algopy_testing.state import Box, BoxMap, BoxRef, GlobalState, LocalState from _algopy_testing.value_generators.arc4 import ARC4ValueGenerator from _algopy_testing.value_generators.avm import AVMValueGenerator @@ -39,6 +39,7 @@ "BoxRef", "Bytes", "Contract", + "FixedBytes", "GlobalState", "ITxnGroupLoader", "ITxnLoader", diff --git a/src/_algopy_testing/decorators/arc4.py b/src/_algopy_testing/decorators/arc4.py index d75a9746..b886e39c 100644 --- a/src/_algopy_testing/decorators/arc4.py +++ b/src/_algopy_testing/decorators/arc4.py @@ -12,7 +12,7 @@ from _algopy_testing.constants import ALWAYS_APPROVE_TEAL_PROGRAM, ARC4_RETURN_PREFIX from _algopy_testing.context_helpers import lazy_context from _algopy_testing.enums import OnCompleteAction -from _algopy_testing.primitives import BigUInt, Bytes, String, UInt64 +from _algopy_testing.primitives import BigUInt, Bytes, FixedBytes, String, UInt64 _P = typing.ParamSpec("_P") _R = typing.TypeVar("_R") @@ -418,6 +418,8 @@ def _type_to_arc4( # noqa: PLR0912 PLR0911 return "uint512" if issubclass(annotation, Bytes): return "byte[]" + if issubclass(annotation, FixedBytes): + return f"byte[{annotation._length}]" if issubclass(annotation, bool): return "bool" raise TypeError(f"type not a valid ARC4 type: {annotation}") diff --git a/src/_algopy_testing/primitives/__init__.py b/src/_algopy_testing/primitives/__init__.py index 668f9487..e361a2ed 100644 --- a/src/_algopy_testing/primitives/__init__.py +++ b/src/_algopy_testing/primitives/__init__.py @@ -9,6 +9,7 @@ ) from _algopy_testing.primitives.biguint import BigUInt from _algopy_testing.primitives.bytes import Bytes +from _algopy_testing.primitives.fixed_bytes import FixedBytes from _algopy_testing.primitives.string import String from _algopy_testing.primitives.uint64 import UInt64 @@ -17,6 +18,7 @@ "BigUInt", "Bytes", "FixedArray", + "FixedBytes", "ImmutableArray", "ImmutableFixedArray", "ReferenceArray", diff --git a/src/_algopy_testing/primitives/bytes.py b/src/_algopy_testing/primitives/bytes.py index c738a596..6a87fa44 100644 --- a/src/_algopy_testing/primitives/bytes.py +++ b/src/_algopy_testing/primitives/bytes.py @@ -7,6 +7,8 @@ if TYPE_CHECKING: from collections.abc import Iterator + from _algopy_testing.primitives.fixed_bytes import FixedBytes + from itertools import zip_longest @@ -27,7 +29,7 @@ def __init__(self, value: bytes = b"") -> None: check_type(value, bytes) self.value = as_bytes(value) - def __contains__(self, item: Bytes | bytes) -> bool: + def __contains__(self, item: Bytes | FixedBytes | bytes) -> bool: # type: ignore[type-arg] item_bytes = as_bytes(item) return item_bytes in self.value @@ -43,11 +45,8 @@ def __bool__(self) -> bool: def __add__(self, other: Bytes | bytes) -> Bytes: """Concatenate Bytes with another Bytes or bytes literal e.g. `Bytes(b"Hello ") + b"World"`.""" - if isinstance(other, Bytes): - return _checked_result(self.value + other.value, "+") - else: - result = self.value + as_bytes(other) - return _checked_result(result, "+") + result = self.value + as_bytes(other) + return _checked_result(result, "+") def __radd__(self, other: bytes) -> Bytes: """Concatenate Bytes with another Bytes or bytes literal e.g. `b"Hello " + @@ -70,7 +69,7 @@ def __getitem__( self, index: UInt64 | int | slice ) -> Bytes: # maps to substring/substring3 if slice, extract/extract3 otherwise? """Returns a Bytes containing a single byte if indexed with UInt64 or int - otherwise the substring o bytes described by the slice.""" + otherwise the substring of bytes described by the slice.""" if isinstance(index, slice): return Bytes(self.value[index]) else: @@ -181,7 +180,7 @@ def _checked_result(result: bytes, op: str) -> Bytes: """Ensures `result` is a valid Bytes value. Raises: - ArithmeticError: If `result` of `op` is out of bounds + OverflowError: If `result` of `op` is out of bounds """ if len(result) > MAX_BYTES_SIZE: raise OverflowError(f"{op} overflows") diff --git a/src/_algopy_testing/primitives/fixed_bytes.py b/src/_algopy_testing/primitives/fixed_bytes.py new file mode 100644 index 00000000..b0a63a97 --- /dev/null +++ b/src/_algopy_testing/primitives/fixed_bytes.py @@ -0,0 +1,325 @@ +from __future__ import annotations + +import base64 +import operator +import types +import typing + +if typing.TYPE_CHECKING: + from collections.abc import Iterator + +from itertools import zip_longest + +from _algopy_testing.constants import MAX_BYTES_SIZE +from _algopy_testing.primitives.bytes import Bytes +from _algopy_testing.primitives.uint64 import UInt64 +from _algopy_testing.protocols import BytesBacked +from _algopy_testing.utils import ( + as_bytes, + get_int_literal_from_type_generic, + get_type_generic_from_int_literal, +) + +_TBytesLength = typing.TypeVar("_TBytesLength", bound=int) +_TBytesLength_Arg = typing.TypeVar("_TBytesLength_Arg", bound=int) + + +def _create_class_from_type(cls: type, length_t: type) -> type: + _length = get_int_literal_from_type_generic(length_t) + return _create_class(cls, _length, length_t) + + +def _create_class_from_int(cls: type, length: int) -> type: + length_t = get_type_generic_from_int_literal(length) + return _create_class(cls, length, length_t) + + +def _create_class(cls: type, length: int, length_t: type) -> type: + cache = cls.__concrete__ if hasattr(cls, "__concrete__") else {} + if c := cache.get(length_t, None): + assert isinstance(c, type) + return c + + cls_name = f"{cls.__name__}[{length}]" + + cache[length_t] = t = types.new_class( + cls_name, + bases=(cls,), + exec_body=lambda ns: ns.update( + _length=length, + ), + ) + return t + + +class _FixedBytesMeta(type): + __concrete__: typing.ClassVar[dict[type, type]] = {} + + # get or create a type that is parametrized with element_t and length + def __getitem__(cls, length_t: type) -> type: + if length_t == typing.Any: + return cls + + return _create_class_from_type(cls, length_t) + + +class FixedBytes( + BytesBacked, + typing.Generic[_TBytesLength], + metaclass=_FixedBytesMeta, +): + """A statically-sized byte sequence, where the length is known at compile time. + + Unlike `Bytes`, `FixedBytes` has a fixed length specified via a type parameter. + + Example: + FixedBytes[typing.Literal[32]] # A 32-byte fixed-size bytes value + """ + + value: bytes # underlying 'bytes' value representing the FixedBytes + _length: int + + def __init__(self, value: Bytes | bytes | None = None, /): + if value is None: + self.value = b"\x00" * self._length + return + + self.value = as_bytes(value) + if not hasattr(self, "_length"): + self._length = len(self.value) + + if len(self.value) != self._length: + raise ValueError(f"expected value of length {self._length}, not {len(self.value)}") + + def __repr__(self) -> str: + return repr(self.value) + + def __str__(self) -> str: + return str(self.value) + + def __bool__(self) -> bool: + return bool(self._length) + + def __len__(self) -> int: + return self._length + + # mypy suggests due to Liskov below should be other: object + # need to consider ramifications here, ignoring it for now + def __eq__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool: # type: ignore[override] + """FixedBytes can be compared using the `==` operator with another FixedBytes, + Bytes or bytes.""" + + if isinstance(other, FixedBytes) and other.length != self.length: + return False + + try: + other_bytes = as_bytes(other) + except TypeError: + return NotImplemented + + return self.value == other_bytes + + def __hash__(self) -> int: + return hash(self.value) + + def __add__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> Bytes: + """Concatenate FixedBytes with another Bytes or bytes literal e.g. + `FixedBytes[typing.Literal[5]](b"Hello ") + b"World"`.""" + result = self.value + as_bytes(other) + return _checked_result(result, "+") + + def __radd__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> Bytes: + """Concatenate FixedBytes with another Bytes or bytes literal e.g. `b"Hello " + + FixedBytes[typing.Literal[5]](b"World")`.""" + result = as_bytes(other) + self.value + return _checked_result(result, "+") + + @property + def length(self) -> UInt64: + """Returns the specified length of the FixedBytes.""" + return UInt64(self._length) + + def __getitem__( + self, index: UInt64 | int | slice + ) -> Bytes: # maps to substring/substring3 if slice, extract/extract3 otherwise? + """Returns a Bytes containing a single byte if indexed with UInt64 or int + otherwise the substring of bytes described by the slice.""" + value = self.value[None : self.length] + if isinstance(index, slice): + return Bytes(value[index]) + else: + int_index = index.value if isinstance(index, UInt64) else index + int_index = self.length.value + int_index if int_index < 0 else int_index + if (int_index >= self.length) or (int_index < 0): + raise ValueError("FixedBytes index out of range") + # my_bytes[0:1] => b'j' whereas my_bytes[0] => 106 + return Bytes(value[slice(int_index, int_index + 1)]) + + def __iter__(self) -> Iterator[Bytes]: + """FixedBytes can be iterated, yielding each consecutive byte.""" + return _FixedBytesIter(self, 1) + + def __reversed__(self) -> Iterator[Bytes]: + """FixedBytes can be iterated in reverse, yield each preceding byte starting at + the end.""" + return _FixedBytesIter(self, -1) + + @typing.overload + def __and__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap] + @typing.overload + def __and__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ... + def __and__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes: + """Compute the bitwise AND of the FixedBytes with another FixedBytes, Bytes, or + bytes. + + Returns FixedBytes if other has the same length, otherwise returns Bytes. + """ + return self._operate_bitwise(other, "and_") + + def __rand__(self, other: bytes) -> Bytes: + return self & other + + def __iand__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc] + other_bytes = as_bytes(other) + other_fixed_bytes = self.__class__(other_bytes) + result = self._operate_bitwise(other_fixed_bytes, "and_") + assert isinstance(result, self.__class__) + return result + + @typing.overload + def __or__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap] + @typing.overload + def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ... + def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes: + return self._operate_bitwise(other, "or_") + + def __ror__(self, other: bytes) -> Bytes: + return self | other + + def __ior__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc] + other_bytes = as_bytes(other) + other_fixed_bytes = self.__class__(other_bytes) + result = self._operate_bitwise(other_fixed_bytes, "or_") + assert isinstance(result, self.__class__) + return result + + @typing.overload + def __xor__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap] + @typing.overload + def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ... + def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes: + return self._operate_bitwise(other, "xor") + + def __rxor__(self, other: bytes) -> Bytes: + return self ^ other + + def __ixor__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc] + other_bytes = as_bytes(other) + other_fixed_bytes = self.__class__(other_bytes) + result = self._operate_bitwise(other_fixed_bytes, "xor") + assert isinstance(result, self.__class__) + return result + + def __invert__(self) -> typing.Self: + """Compute the bitwise inversion of the FixedBytes. + + Returns: + FixedBytes: The result of the bitwise inversion operation. + """ + return self.__class__.from_bytes(bytes(~x + 256 for x in self.value)) + + def _operate_bitwise( + self, + other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes, + operator_name: str, + ) -> typing.Self | Bytes: + op = getattr(operator, operator_name) + maybe_bytes = as_bytes(other) + # pad the shorter of self.value and other bytes with leading zero + # by reversing them as zip_longest fills at the end + + result = bytes( + reversed( + bytes( + op(a[0], a[1]) + for a in zip_longest(reversed(self.value), reversed(maybe_bytes), fillvalue=0) + ) + ) + ) + if isinstance(other, FixedBytes) and len(other.value) == len(self.value): + return self.__class__.from_bytes(result) + return Bytes(result) + + def __contains__(self, item: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool: + item_bytes = as_bytes(item) + return item_bytes in self.value + + @classmethod + def from_base32(cls, value: str) -> typing.Self: + """Creates FixedBytes from a base32 encoded string e.g. + `FixedBytes.from_base32("74======")`""" + bytes_value = base64.b32decode(value) + c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls + return c(bytes_value) # type: ignore[no-any-return] + + @classmethod + def from_base64(cls, value: str) -> typing.Self: + """Creates FixedBytes from a base64 encoded string e.g. + `FixedBytes.from_base64("RkY=")`""" + bytes_value = base64.b64decode(value) + c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls + return c(bytes_value) # type: ignore[no-any-return] + + @classmethod + def from_hex(cls, value: str) -> typing.Self: + """Creates FixedBytes from a hex/octal encoded string e.g. + `FixedBytes.from_hex("FF")`""" + bytes_value = base64.b16decode(value) + c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls + return c(bytes_value) # type: ignore[no-any-return] + + @classmethod + def from_bytes(cls, value: Bytes | bytes) -> typing.Self: + """Construct an instance from the underlying bytes (no validation)""" + bytes_value = as_bytes(value) + c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls + result = c() + result.value = bytes_value + return result # type: ignore[no-any-return] + + @property + def bytes(self) -> Bytes: + """Get the underlying Bytes.""" + return Bytes(self.value) + + +class _FixedBytesIter(typing.Generic[_TBytesLength]): + value: FixedBytes[_TBytesLength] + + def __init__(self, sequence: FixedBytes[_TBytesLength], step: int = 1): + self.value = sequence + self.current = 0 if step > 0 else len(sequence) - 1 + self.step = step + self.myend = len(sequence) - 1 if step > 0 else 0 + + def __iter__(self) -> typing.Self: + return self + + def __next__(self) -> Bytes: + # if current is one step over the end + if self.current == self.myend + self.step: + raise StopIteration + + self.current += self.step + return self.value[self.current - self.step] + + +def _checked_result(result: bytes, op: str) -> Bytes: + """Ensures `result` is a valid Bytes value. + + Raises: + OverflowError: If `result` of `op` is out of bounds + """ + if len(result) > MAX_BYTES_SIZE: + raise OverflowError(f"{op} overflows") + return Bytes(result) diff --git a/src/_algopy_testing/serialize.py b/src/_algopy_testing/serialize.py index 14b819af..c575b0bc 100644 --- a/src/_algopy_testing/serialize.py +++ b/src/_algopy_testing/serialize.py @@ -4,6 +4,7 @@ import typing from collections.abc import Callable, Sequence +from _algopy_testing.primitives.fixed_bytes import FixedBytes from _algopy_testing.primitives.uint64 import UInt64 from _algopy_testing.utils import get_type_generic_from_int_literal @@ -62,6 +63,15 @@ def get_native_to_arc4_serializer( # noqa: PLR0911 native_to_arc4=lambda n: arc4.UInt64(n.int_), arc4_to_native=lambda a: typ.from_int(a.native), ) + if issubclass(typ, FixedBytes): + length_type = get_type_generic_from_int_literal(typ._length) + arc4_static_bytes = arc4.StaticArray[arc4.Byte, length_type] # type: ignore[valid-type] + return _Serializer( + arc4_type=arc4_static_bytes, + native_to_arc4=lambda n: arc4_static_bytes(*[arc4.Byte.from_bytes(e) for e in n]), + arc4_to_native=lambda a: typ(a.bytes), + ) + if typing.NamedTuple in getattr(typ, "__orig_bases__", []): tuple_fields = tuple(inspect.get_annotations(typ).values()) if any(isinstance(f, str) for f in tuple_fields): diff --git a/src/_algopy_testing/utils.py b/src/_algopy_testing/utils.py index 8338e5da..49fdb817 100644 --- a/src/_algopy_testing/utils.py +++ b/src/_algopy_testing/utils.py @@ -103,6 +103,8 @@ def as_bytes(value: object, *, max_size: int = MAX_BYTES_SIZE) -> bytes: pass case _algopy_testing.Bytes(value=bytes_value): pass + case _algopy_testing.FixedBytes(value=bytes_value): + pass case _: raise TypeError(f"value must be a bytes or Bytes type, not {type(value).__name__!r}") if len(bytes_value) > max_size: diff --git a/src/_algopy_testing/value_generators/avm.py b/src/_algopy_testing/value_generators/avm.py index 76f53224..0c46b716 100644 --- a/src/_algopy_testing/value_generators/avm.py +++ b/src/_algopy_testing/value_generators/avm.py @@ -23,6 +23,8 @@ if typing.TYPE_CHECKING: import algopy +_TBytesLength = typing.TypeVar("_TBytesLength", bound=int) + class AVMValueGenerator: """Factory for generating test data for AVM abstractions (uint64, bytes, string, @@ -198,6 +200,19 @@ def bytes(self, length: int | None = None) -> algopy.Bytes: length = length or MAX_BYTES_SIZE return _algopy_testing.Bytes(secrets.token_bytes(length)) + def fixed_bytes( + self, fixed_bytes_type: type[algopy.FixedBytes[_TBytesLength]] + ) -> algopy.FixedBytes[_TBytesLength]: + """Generate a random fixed byte sequence of a specified length. + + :param fixed_bytes_type: The FixedBytes type with length parameter (e.g., + FixedBytes[typing.Literal[10]]). + :returns: The randomly generated fixed byte sequence. + """ + # Extract the length from the type parameter + length = fixed_bytes_type._length + return fixed_bytes_type(secrets.token_bytes(length)) + def _get_app_id(app: algopy.Application | algopy.UInt64 | int) -> int: from _algopy_testing.models import Application diff --git a/src/algopy/__init__.py b/src/algopy/__init__.py index 9234545b..cb985807 100644 --- a/src/algopy/__init__.py +++ b/src/algopy/__init__.py @@ -19,6 +19,7 @@ BigUInt, Bytes, FixedArray, + FixedBytes, ImmutableArray, ImmutableFixedArray, ReferenceArray, @@ -49,6 +50,7 @@ "CompiledLogicSig", "Contract", "FixedArray", + "FixedBytes", "Global", "GlobalState", "ImmutableArray", diff --git a/tests/arc4/test_arc4_method_signature.py b/tests/arc4/test_arc4_method_signature.py index 2db30c3d..eaf53520 100644 --- a/tests/arc4/test_arc4_method_signature.py +++ b/tests/arc4/test_arc4_method_signature.py @@ -1,3 +1,4 @@ +import typing from collections.abc import Generator from pathlib import Path @@ -70,17 +71,22 @@ def test_app_args_is_correct_with_simple_args( # act # ensure same execution in AVM runs without errors - get_avm_result("sink", value="hello", arr=[1, 2]) + get_avm_result("sink", value="hello", arr=[1, 2], fixed_bytes=b"test") # then run inside emulator - contract.sink(arc4.String("hello"), UInt8Array(arc4.UInt8(1), arc4.UInt8(2))) + contract.sink( + arc4.String("hello"), + UInt8Array(arc4.UInt8(1), arc4.UInt8(2)), + algopy.FixedBytes[typing.Literal[4]](b"test"), + ) # assert txn = context.txn.last_active app_args = [txn.app_args(i) for i in range(int(txn.num_app_args))] assert app_args == [ - algosdk.abi.Method.from_signature("sink(string,uint8[])void").get_selector(), + algosdk.abi.Method.from_signature("sink(string,uint8[],byte[4])void").get_selector(), b"\x00\x05hello", b"\x00\x02\x01\x02", + b"test", ] assert app_args[0] == arc4.arc4_signature(SignaturesContract.sink) diff --git a/tests/artifacts/Arc4ABIMethod/contract.py b/tests/artifacts/Arc4ABIMethod/contract.py index aabcef5f..afca75b6 100644 --- a/tests/artifacts/Arc4ABIMethod/contract.py +++ b/tests/artifacts/Arc4ABIMethod/contract.py @@ -1,7 +1,7 @@ import typing import algopy.gtxn -from algopy import Account, Application, ARC4Contract, Asset, Txn, arc4, gtxn, op +from algopy import Account, Application, ARC4Contract, Asset, FixedBytes, Txn, arc4, gtxn, op UInt8Array = arc4.DynamicArray[arc4.UInt8] MyAlias: typing.TypeAlias = arc4.BigUIntN[typing.Literal[128]] @@ -34,9 +34,12 @@ def create(self) -> None: assert Txn.application_id == 0, "expected txn to have 0" @arc4.abimethod(validate_encoding="unsafe_disabled") - def sink(self, value: arc4.String, arr: UInt8Array) -> None: + def sink( + self, value: arc4.String, arr: UInt8Array, fixed_bytes: FixedBytes[typing.Literal[4]] + ) -> None: assert value assert arr + assert fixed_bytes.length == 4 @arc4.abimethod(name="alias") def sink2(self, value: arc4.String, arr: UInt8Array) -> None: diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal index eb3ed524..82d5d866 100644 --- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal @@ -12,7 +12,7 @@ main: assert txn ApplicationID bz main_create_NoOp@13 - pushbytess 0xe18922d8 0x3b05cf17 0x0658dcc3 0x5b6447de 0x061f4e77 0xeaa89139 0x510e72a4 0xd6c2ac7f 0x48142d5e // method "sink(string,uint8[])void", method "alias(string,uint8[])void", method "with_txn(string,pay,uint8[])void", method "with_asset(string,asset,uint8[])void", method "with_app(string,application,uint64,uint8[])void", method "with_acc(string,account,uint8[])void", method "complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))", method "echo_resource_by_index(asset,application,account)(uint64,uint64,address)", method "echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)" + pushbytess 0x2e01781e 0x3b05cf17 0x0658dcc3 0x5b6447de 0x061f4e77 0xeaa89139 0x510e72a4 0xd6c2ac7f 0x48142d5e // method "sink(string,uint8[],byte[4])void", method "alias(string,uint8[])void", method "with_txn(string,pay,uint8[])void", method "with_asset(string,asset,uint8[])void", method "with_app(string,application,uint64,uint8[])void", method "with_acc(string,account,uint8[])void", method "complex_sig(((uint64,string),(uint64,string),uint128,uint128),txn,account,uint8[])((uint64,string),((uint64,string),(uint64,string),uint128,uint128))", method "echo_resource_by_index(asset,application,account)(uint64,uint64,address)", method "echo_resource_by_value(uint64,uint64,address)(uint64,uint64,address)" txna ApplicationArgs 0 match sink sink2 with_txn with_asset with_app with_acc complex_sig echo_resource_by_index echo_resource_by_value err @@ -74,12 +74,12 @@ sink: // @arc4.abimethod(validate_encoding="unsafe_disabled") txna ApplicationArgs 2 txna ApplicationArgs 1 - // tests/artifacts/Arc4ABIMethod/contract.py:38 + // tests/artifacts/Arc4ABIMethod/contract.py:40 // assert value bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:39 + // tests/artifacts/Arc4ABIMethod/contract.py:41 // assert arr bytec_0 // 0x0000 != @@ -92,21 +92,21 @@ sink: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.sink2[routing]() -> void: sink2: - // tests/artifacts/Arc4ABIMethod/contract.py:41 + // tests/artifacts/Arc4ABIMethod/contract.py:44 // @arc4.abimethod(name="alias") txna ApplicationArgs 2 txna ApplicationArgs 1 - // tests/artifacts/Arc4ABIMethod/contract.py:43 + // tests/artifacts/Arc4ABIMethod/contract.py:46 // assert value bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:44 + // tests/artifacts/Arc4ABIMethod/contract.py:47 // assert arr bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:41 + // tests/artifacts/Arc4ABIMethod/contract.py:44 // @arc4.abimethod(name="alias") intc_0 // 1 return @@ -114,7 +114,7 @@ sink2: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.with_txn[routing]() -> void: with_txn: - // tests/artifacts/Arc4ABIMethod/contract.py:46 + // tests/artifacts/Arc4ABIMethod/contract.py:49 // @arc4.abimethod txna ApplicationArgs 1 txn GroupIndex @@ -126,36 +126,36 @@ with_txn: == assert // transaction type is pay txna ApplicationArgs 2 - // tests/artifacts/Arc4ABIMethod/contract.py:48 + // tests/artifacts/Arc4ABIMethod/contract.py:51 // assert value uncover 2 bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:49 + // tests/artifacts/Arc4ABIMethod/contract.py:52 // assert arr bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:50 + // tests/artifacts/Arc4ABIMethod/contract.py:53 // assert pay.group_index == 0 dup gtxns GroupIndex ! assert - // tests/artifacts/Arc4ABIMethod/contract.py:51 + // tests/artifacts/Arc4ABIMethod/contract.py:54 // assert Txn.group_index == 1 txn GroupIndex intc_0 // 1 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:52 + // tests/artifacts/Arc4ABIMethod/contract.py:55 // assert pay.amount == 123 gtxns Amount intc_3 // 123 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:46 + // tests/artifacts/Arc4ABIMethod/contract.py:49 // @arc4.abimethod intc_0 // 1 return @@ -163,25 +163,25 @@ with_txn: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.with_asset[routing]() -> void: with_asset: - // tests/artifacts/Arc4ABIMethod/contract.py:54 + // tests/artifacts/Arc4ABIMethod/contract.py:57 // @arc4.abimethod(resource_encoding="index") txna ApplicationArgs 1 txna ApplicationArgs 2 btoi txnas Assets txna ApplicationArgs 3 - // tests/artifacts/Arc4ABIMethod/contract.py:56 + // tests/artifacts/Arc4ABIMethod/contract.py:59 // assert value uncover 2 bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:57 + // tests/artifacts/Arc4ABIMethod/contract.py:60 // assert arr bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:58 + // tests/artifacts/Arc4ABIMethod/contract.py:61 // assert asset.total == 123 dup asset_params_get AssetTotal @@ -189,12 +189,12 @@ with_asset: intc_3 // 123 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:59 + // tests/artifacts/Arc4ABIMethod/contract.py:62 // assert Txn.assets(0) == asset txna Assets 0 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:54 + // tests/artifacts/Arc4ABIMethod/contract.py:57 // @arc4.abimethod(resource_encoding="index") intc_0 // 1 return @@ -202,7 +202,7 @@ with_asset: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.with_app[routing]() -> void: with_app: - // tests/artifacts/Arc4ABIMethod/contract.py:61 + // tests/artifacts/Arc4ABIMethod/contract.py:64 // @arc4.abimethod(resource_encoding="index") txna ApplicationArgs 1 txna ApplicationArgs 2 @@ -210,24 +210,24 @@ with_app: txnas Applications txna ApplicationArgs 3 txna ApplicationArgs 4 - // tests/artifacts/Arc4ABIMethod/contract.py:65 + // tests/artifacts/Arc4ABIMethod/contract.py:68 // assert value uncover 3 bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:66 + // tests/artifacts/Arc4ABIMethod/contract.py:69 // assert arr bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:67 + // tests/artifacts/Arc4ABIMethod/contract.py:70 // assert app.id == app_id, "expected app id to match provided app id" dig 1 itob b== assert // expected app id to match provided app id - // tests/artifacts/Arc4ABIMethod/contract.py:68 + // tests/artifacts/Arc4ABIMethod/contract.py:71 // assert app.creator == op.Global.creator_address, "expected other app to have same creator" dup app_params_get AppCreator @@ -235,7 +235,7 @@ with_app: global CreatorAddress == assert // expected other app to have same creator - // tests/artifacts/Arc4ABIMethod/contract.py:69 + // tests/artifacts/Arc4ABIMethod/contract.py:72 // app_txn = gtxn.ApplicationCallTransaction(0) intc_1 // 0 gtxns TypeEnum @@ -243,35 +243,35 @@ with_app: == assert // transaction type is appl intc_1 // 0 - // tests/artifacts/Arc4ABIMethod/contract.py:70 + // tests/artifacts/Arc4ABIMethod/contract.py:73 // assert app_txn.apps(0) == op.Global.current_application_id dup gtxnsas Applications global CurrentApplicationID == assert - // tests/artifacts/Arc4ABIMethod/contract.py:71 + // tests/artifacts/Arc4ABIMethod/contract.py:74 // assert Txn.applications(0) == op.Global.current_application_id txna Applications 0 global CurrentApplicationID == assert - // tests/artifacts/Arc4ABIMethod/contract.py:69 + // tests/artifacts/Arc4ABIMethod/contract.py:72 // app_txn = gtxn.ApplicationCallTransaction(0) intc_1 // 0 - // tests/artifacts/Arc4ABIMethod/contract.py:72 + // tests/artifacts/Arc4ABIMethod/contract.py:75 // assert app_txn.apps(1) == app intc_0 // 1 gtxnsas Applications dig 1 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:73 + // tests/artifacts/Arc4ABIMethod/contract.py:76 // assert Txn.applications(1) == app txna Applications 1 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:61 + // tests/artifacts/Arc4ABIMethod/contract.py:64 // @arc4.abimethod(resource_encoding="index") intc_0 // 1 return @@ -279,25 +279,25 @@ with_app: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.with_acc[routing]() -> void: with_acc: - // tests/artifacts/Arc4ABIMethod/contract.py:75 + // tests/artifacts/Arc4ABIMethod/contract.py:78 // @arc4.abimethod(resource_encoding="index") txna ApplicationArgs 1 txna ApplicationArgs 2 btoi txnas Accounts txna ApplicationArgs 3 - // tests/artifacts/Arc4ABIMethod/contract.py:77 + // tests/artifacts/Arc4ABIMethod/contract.py:80 // assert value uncover 2 bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:78 + // tests/artifacts/Arc4ABIMethod/contract.py:81 // assert arr bytec_0 // 0x0000 != assert - // tests/artifacts/Arc4ABIMethod/contract.py:79 + // tests/artifacts/Arc4ABIMethod/contract.py:82 // assert acc.balance == acc.min_balance + 1234 dup acct_params_get AcctBalance @@ -309,18 +309,18 @@ with_acc: + == assert - // tests/artifacts/Arc4ABIMethod/contract.py:80 + // tests/artifacts/Arc4ABIMethod/contract.py:83 // assert Txn.accounts(0) == Txn.sender txna Accounts 0 txn Sender == assert - // tests/artifacts/Arc4ABIMethod/contract.py:81 + // tests/artifacts/Arc4ABIMethod/contract.py:84 // assert Txn.accounts(1) == acc txna Accounts 1 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:75 + // tests/artifacts/Arc4ABIMethod/contract.py:78 // @arc4.abimethod(resource_encoding="index") intc_0 // 1 return @@ -328,7 +328,7 @@ with_acc: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.complex_sig[routing]() -> void: complex_sig: - // tests/artifacts/Arc4ABIMethod/contract.py:83 + // tests/artifacts/Arc4ABIMethod/contract.py:86 // @arc4.abimethod(resource_encoding="index") txna ApplicationArgs 1 txn GroupIndex @@ -338,7 +338,7 @@ complex_sig: btoi txnas Accounts txna ApplicationArgs 3 - // tests/artifacts/Arc4ABIMethod/contract.py:87 + // tests/artifacts/Arc4ABIMethod/contract.py:90 // five.validate() dup intc_1 // 0 @@ -349,13 +349,13 @@ complex_sig: len == assert // invalid number of bytes for arc4.dynamic_array - // tests/artifacts/Arc4ABIMethod/contract.py:88 + // tests/artifacts/Arc4ABIMethod/contract.py:91 // assert Txn.num_app_args == 4 txn NumAppArgs pushint 4 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:89-90 + // tests/artifacts/Arc4ABIMethod/contract.py:92-93 // # struct // assert struct1.another_struct.one == 1 dig 3 @@ -373,7 +373,7 @@ complex_sig: bytec_2 // 0x0000000000000001 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:89-91 + // tests/artifacts/Arc4ABIMethod/contract.py:92-94 // # struct // assert struct1.another_struct.one == 1 // assert struct1.another_struct.two == "2" @@ -386,12 +386,12 @@ complex_sig: uncover 2 dig 2 substring3 - // tests/artifacts/Arc4ABIMethod/contract.py:91 + // tests/artifacts/Arc4ABIMethod/contract.py:94 // assert struct1.another_struct.two == "2" bytec_3 // 0x000132 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:92 + // tests/artifacts/Arc4ABIMethod/contract.py:95 // assert struct1.another_struct_alias.one == 1 dig 6 len @@ -404,7 +404,7 @@ complex_sig: bytec_2 // 0x0000000000000001 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:92-93 + // tests/artifacts/Arc4ABIMethod/contract.py:95-96 // assert struct1.another_struct_alias.one == 1 // assert struct1.another_struct_alias.two == "2" dup @@ -413,28 +413,28 @@ complex_sig: dig 1 len substring3 - // tests/artifacts/Arc4ABIMethod/contract.py:91 + // tests/artifacts/Arc4ABIMethod/contract.py:94 // assert struct1.another_struct.two == "2" bytec_3 // 0x000132 - // tests/artifacts/Arc4ABIMethod/contract.py:93 + // tests/artifacts/Arc4ABIMethod/contract.py:96 // assert struct1.another_struct_alias.two == "2" == assert - // tests/artifacts/Arc4ABIMethod/contract.py:94 + // tests/artifacts/Arc4ABIMethod/contract.py:97 // assert struct1.three == 3 dig 5 extract 4 16 pushbytes 0x00000000000000000000000000000003 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:95 + // tests/artifacts/Arc4ABIMethod/contract.py:98 // assert struct1.four == 4 dig 5 extract 20 16 pushbytes 0x00000000000000000000000000000004 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:97-98 + // tests/artifacts/Arc4ABIMethod/contract.py:100-101 // # txn // assert txn.group_index == Txn.group_index - 1 uncover 4 @@ -444,14 +444,14 @@ complex_sig: - == assert - // tests/artifacts/Arc4ABIMethod/contract.py:100-101 + // tests/artifacts/Arc4ABIMethod/contract.py:103-104 // # acc // assert Txn.application_args(2) == arc4.UInt8(1).bytes # acc array ref txna ApplicationArgs 2 pushbytes 0x01 == assert - // tests/artifacts/Arc4ABIMethod/contract.py:102 + // tests/artifacts/Arc4ABIMethod/contract.py:105 // assert acc.balance == acc.min_balance + 1234 dig 3 acct_params_get AcctBalance @@ -463,14 +463,14 @@ complex_sig: + == assert - // tests/artifacts/Arc4ABIMethod/contract.py:103 + // tests/artifacts/Arc4ABIMethod/contract.py:106 // assert five[0] == 5 uncover 2 extract 2 1 pushbytes 0x05 b== assert - // tests/artifacts/Arc4ABIMethod/contract.py:83 + // tests/artifacts/Arc4ABIMethod/contract.py:86 // @arc4.abimethod(resource_encoding="index") pushint 4 + @@ -493,7 +493,7 @@ complex_sig: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.echo_resource_by_index[routing]() -> void: echo_resource_by_index: - // tests/artifacts/Arc4ABIMethod/contract.py:107-109 + // tests/artifacts/Arc4ABIMethod/contract.py:110-112 // @arc4.abimethod( // resource_encoding="index", // ) @@ -506,37 +506,37 @@ echo_resource_by_index: txna ApplicationArgs 3 btoi txnas Accounts - // tests/artifacts/Arc4ABIMethod/contract.py:113 + // tests/artifacts/Arc4ABIMethod/contract.py:116 // asset_idx = op.btoi(Txn.application_args(1)) txna ApplicationArgs 1 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:114 + // tests/artifacts/Arc4ABIMethod/contract.py:117 // assert asset == Txn.assets(asset_idx), "expected asset to be passed by index" txnas Assets dig 3 == assert // expected asset to be passed by index - // tests/artifacts/Arc4ABIMethod/contract.py:115 + // tests/artifacts/Arc4ABIMethod/contract.py:118 // app_idx = op.btoi(Txn.application_args(2)) txna ApplicationArgs 2 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:116 + // tests/artifacts/Arc4ABIMethod/contract.py:119 // assert app == Txn.applications(app_idx), "expected application to be passed by index" txnas Applications dig 2 == assert // expected application to be passed by index - // tests/artifacts/Arc4ABIMethod/contract.py:117 + // tests/artifacts/Arc4ABIMethod/contract.py:120 // acc_idx = op.btoi(Txn.application_args(3)) txna ApplicationArgs 3 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:118 + // tests/artifacts/Arc4ABIMethod/contract.py:121 // assert acc == Txn.accounts(acc_idx), "expected account to be passed by index" txnas Accounts dig 1 == assert // expected account to be passed by index - // tests/artifacts/Arc4ABIMethod/contract.py:107-109 + // tests/artifacts/Arc4ABIMethod/contract.py:110-112 // @arc4.abimethod( // resource_encoding="index", // ) @@ -557,7 +557,7 @@ echo_resource_by_index: // tests.artifacts.Arc4ABIMethod.contract.SignaturesContract.echo_resource_by_value[routing]() -> void: echo_resource_by_value: - // tests/artifacts/Arc4ABIMethod/contract.py:121-123 + // tests/artifacts/Arc4ABIMethod/contract.py:124-126 // @arc4.abimethod( // resource_encoding="value", // ) @@ -566,42 +566,42 @@ echo_resource_by_value: txna ApplicationArgs 2 btoi txna ApplicationArgs 3 - // tests/artifacts/Arc4ABIMethod/contract.py:127 + // tests/artifacts/Arc4ABIMethod/contract.py:130 // acc.validate() dup len pushint 32 == assert // invalid number of bytes for arc4.static_array - // tests/artifacts/Arc4ABIMethod/contract.py:128 + // tests/artifacts/Arc4ABIMethod/contract.py:131 // asset_id = op.btoi(Txn.application_args(1)) txna ApplicationArgs 1 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:129 + // tests/artifacts/Arc4ABIMethod/contract.py:132 // assert asset.id == asset_id, "expected asset to be passed by value" dig 3 == assert // expected asset to be passed by value - // tests/artifacts/Arc4ABIMethod/contract.py:130 + // tests/artifacts/Arc4ABIMethod/contract.py:133 // app_id = op.btoi(Txn.application_args(2)) txna ApplicationArgs 2 btoi - // tests/artifacts/Arc4ABIMethod/contract.py:131 + // tests/artifacts/Arc4ABIMethod/contract.py:134 // assert app.id == app_id, "expected application to be passed by value" dig 2 == assert // expected application to be passed by value - // tests/artifacts/Arc4ABIMethod/contract.py:133 + // tests/artifacts/Arc4ABIMethod/contract.py:136 // assert acc.bytes == address, "expected account to be passed by value" dup - // tests/artifacts/Arc4ABIMethod/contract.py:132 + // tests/artifacts/Arc4ABIMethod/contract.py:135 // address = Txn.application_args(3) txna ApplicationArgs 3 - // tests/artifacts/Arc4ABIMethod/contract.py:133 + // tests/artifacts/Arc4ABIMethod/contract.py:136 // assert acc.bytes == address, "expected account to be passed by value" == assert // expected account to be passed by value - // tests/artifacts/Arc4ABIMethod/contract.py:121-123 + // tests/artifacts/Arc4ABIMethod/contract.py:124-126 // @arc4.abimethod( // resource_encoding="value", // ) diff --git a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json index 190ec6f8..54e91132 100644 --- a/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +++ b/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json @@ -57,6 +57,10 @@ { "type": "uint8[]", "name": "arr" + }, + { + "type": "byte[4]", + "name": "fixed_bytes" } ], "returns": { @@ -472,11 +476,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4ZTE4OTIyZDggMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSl2b2lkIiwgbWV0aG9kICJhbGlhcyhzdHJpbmcsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX3R4bihzdHJpbmcscGF5LHVpbnQ4W10pdm9pZCIsIG1ldGhvZCAid2l0aF9hc3NldChzdHJpbmcsYXNzZXQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FwcChzdHJpbmcsYXBwbGljYXRpb24sdWludDY0LHVpbnQ4W10pdm9pZCIsIG1ldGhvZCAid2l0aF9hY2Moc3RyaW5nLGFjY291bnQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJjb21wbGV4X3NpZygoKHVpbnQ2NCxzdHJpbmcpLCh1aW50NjQsc3RyaW5nKSx1aW50MTI4LHVpbnQxMjgpLHR4bixhY2NvdW50LHVpbnQ4W10pKCh1aW50NjQsc3RyaW5nKSwoKHVpbnQ2NCxzdHJpbmcpLCh1aW50NjQsc3RyaW5nKSx1aW50MTI4LHVpbnQxMjgpKSIsIG1ldGhvZCAiZWNob19yZXNvdXJjZV9ieV9pbmRleChhc3NldCxhcHBsaWNhdGlvbixhY2NvdW50KSh1aW50NjQsdWludDY0LGFkZHJlc3MpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X3ZhbHVlKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykodWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHNpbmsgc2luazIgd2l0aF90eG4gd2l0aF9hc3NldCB3aXRoX2FwcCB3aXRoX2FjYyBjb21wbGV4X3NpZyBlY2hvX3Jlc291cmNlX2J5X2luZGV4IGVjaG9fcmVzb3VyY2VfYnlfdmFsdWUKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBjbGFzcyBTaWduYXR1cmVzQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHB1c2hieXRlcyAweDRjNWM2MWJhIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZCAhPSAwLCAiZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGlkIgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGlkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMQogICAgLy8gb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcyAhPSBvcC5HbG9iYWwuemVyb19hZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzAtMzIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcyAhPSBvcC5HbG9iYWwuemVyb19hZGRyZXNzCiAgICAvLyApLCAiZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZ2xvYmFsIHRvIGhhdmUgYXBwIGFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBhcHBfdHhuID0gZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbigwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBfaWQgPT0gMCwgImV4cGVjdGVkIHR4biB0byBoYXZlIDAiCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25faWQgPT0gMCwgImV4cGVjdGVkIHR4biB0byBoYXZlIDAiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHR4biB0byBoYXZlIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Quc2lua1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbms6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh2YWxpZGF0ZV9lbmNvZGluZz0idW5zYWZlX2Rpc2FibGVkIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Quc2luazJbcm91dGluZ10oKSAtPiB2b2lkOgpzaW5rMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT0iYWxpYXMiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfdHhuW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aF90eG46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTAKICAgIC8vIGFzc2VydCBwYXkuZ3JvdXBfaW5kZXggPT0gMAogICAgZHVwCiAgICBndHhucyBHcm91cEluZGV4CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBhc3NlcnQgVHhuLmdyb3VwX2luZGV4ID09IDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEyMwogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfYXNzZXRbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2Fzc2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBhc3NlcnQgYXNzZXQudG90YWwgPT0gMTIzCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaW50Y18zIC8vIDEyMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBUeG4uYXNzZXRzKDApID09IGFzc2V0CiAgICB0eG5hIEFzc2V0cyAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfYXBwW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aF9hcHA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMwogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjcKICAgIC8vIGFzc2VydCBhcHAuaWQgPT0gYXBwX2lkLCAiZXhwZWN0ZWQgYXBwIGlkIHRvIG1hdGNoIHByb3ZpZGVkIGFwcCBpZCIKICAgIGRpZyAxCiAgICBpdG9iCiAgICBiPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IGFwcC5jcmVhdG9yID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJleHBlY3RlZCBvdGhlciBhcHAgdG8gaGF2ZSBzYW1lIGNyZWF0b3IiCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvdGhlciBhcHAgdG8gaGF2ZSBzYW1lIGNyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBhcHBfdHhuID0gZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbigwKQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgZHVwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbnMoMCkgPT0gb3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQKICAgIHR4bmEgQXBwbGljYXRpb25zIDAKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcHMoMSkgPT0gYXBwCiAgICBpbnRjXzAgLy8gMQogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbnMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbnMoMSkgPT0gYXBwCiAgICB0eG5hIEFwcGxpY2F0aW9ucyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LndpdGhfYWNjW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aF9hY2M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzcKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3OQogICAgLy8gYXNzZXJ0IGFjYy5iYWxhbmNlID09IGFjYy5taW5fYmFsYW5jZSArIDEyMzQKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgcHVzaGludCAxMjM0CiAgICArCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IFR4bi5hY2NvdW50cygwKSA9PSBUeG4uc2VuZGVyCiAgICB0eG5hIEFjY291bnRzIDAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDEpID09IGFjYwogICAgdHhuYSBBY2NvdW50cyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LmNvbXBsZXhfc2lnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29tcGxleF9zaWc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4NwogICAgLy8gZml2ZS52YWxpZGF0ZSgpCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODgKICAgIC8vIGFzc2VydCBUeG4ubnVtX2FwcF9hcmdzID09IDQKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4OS05MQogICAgLy8gIyBzdHJ1Y3QKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0Lm9uZSA9PSAxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBkdXAKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3QudHdvID09ICIyIgogICAgYnl0ZWNfMyAvLyAweDAwMDEzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICBkaWcgNgogICAgbGVuCiAgICBkaWcgNwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLm9uZSA9PSAxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICBkdXAKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MwogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMudHdvID09ICIyIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLnRocmVlID09IDMKICAgIGRpZyA1CiAgICBleHRyYWN0IDQgMTYKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTUKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmZvdXIgPT0gNAogICAgZGlnIDUKICAgIGV4dHJhY3QgMjAgMTYKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTctOTgKICAgIC8vICMgdHhuCiAgICAvLyBhc3NlcnQgdHhuLmdyb3VwX2luZGV4ID09IFR4bi5ncm91cF9pbmRleCAtIDEKICAgIHVuY292ZXIgNAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIGFjYwogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpID09IGFyYzQuVUludDgoMSkuYnl0ZXMgICMgYWNjIGFycmF5IHJlZgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgcHVzaGJ5dGVzIDB4MDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IGFjYy5iYWxhbmNlID09IGFjYy5taW5fYmFsYW5jZSArIDEyMzQKICAgIGRpZyAzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgdW5jb3ZlciA0CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgcHVzaGludCAxMjM0CiAgICArCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDMKICAgIC8vIGFzc2VydCBmaXZlWzBdID09IDUKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAyIDEKICAgIHB1c2hieXRlcyAweDA1CiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgcHVzaGludCA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X2luZGV4W3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV9pbmRleDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2V0X2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTQKICAgIC8vIGFzc2VydCBhc3NldCA9PSBUeG4uYXNzZXRzKGFzc2V0X2lkeCksICJleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBc3NldHMKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSBpbmRleAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE1CiAgICAvLyBhcHBfaWR4ID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygyKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IGFwcCA9PSBUeG4uYXBwbGljYXRpb25zKGFwcF9pZHgpLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHBsaWNhdGlvbiB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYWNjX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBhY2MgPT0gVHhuLmFjY291bnRzKGFjY19pZHgpLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgiCiAgICB0eG5hcyBBY2NvdW50cwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLkFyYzRBQklNZXRob2QuY29udHJhY3QuU2lnbmF0dXJlc0NvbnRyYWN0LmVjaG9fcmVzb3VyY2VfYnlfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgplY2hvX3Jlc291cmNlX2J5X3ZhbHVlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxLTEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIHJlc291cmNlX2VuY29kaW5nPSJ2YWx1ZSIsCiAgICAvLyApCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjcKICAgIC8vIGFjYy52YWxpZGF0ZSgpCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjgKICAgIC8vIGFzc2V0X2lkID0gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gYXNzZXJ0IGFzc2V0LmlkID09IGFzc2V0X2lkLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzAKICAgIC8vIGFwcF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzEKICAgIC8vIGFzc2VydCBhcHAuaWQgPT0gYXBwX2lkLCAiZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCBhY2MuYnl0ZXMgPT0gYWRkcmVzcywgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIgogICAgZHVwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFkZHJlc3MgPSBUeG4uYXBwbGljYXRpb25fYXJncygzKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyMS0xMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgNiAxMjMKICAgIGJ5dGVjYmxvY2sgMHgwMDAwIDB4MTUxZjdjNzUgMHgwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTMyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyNQogICAgLy8gY2xhc3MgU2lnbmF0dXJlc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEzCiAgICBwdXNoYnl0ZXNzIDB4MmUwMTc4MWUgMHgzYjA1Y2YxNyAweDA2NThkY2MzIDB4NWI2NDQ3ZGUgMHgwNjFmNGU3NyAweGVhYTg5MTM5IDB4NTEwZTcyYTQgMHhkNmMyYWM3ZiAweDQ4MTQyZDVlIC8vIG1ldGhvZCAic2luayhzdHJpbmcsdWludDhbXSxieXRlWzRdKXZvaWQiLCBtZXRob2QgImFsaWFzKHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfdHhuKHN0cmluZyxwYXksdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2Fzc2V0KHN0cmluZyxhc3NldCx1aW50OFtdKXZvaWQiLCBtZXRob2QgIndpdGhfYXBwKHN0cmluZyxhcHBsaWNhdGlvbix1aW50NjQsdWludDhbXSl2b2lkIiwgbWV0aG9kICJ3aXRoX2FjYyhzdHJpbmcsYWNjb3VudCx1aW50OFtdKXZvaWQiLCBtZXRob2QgImNvbXBsZXhfc2lnKCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCksdHhuLGFjY291bnQsdWludDhbXSkoKHVpbnQ2NCxzdHJpbmcpLCgodWludDY0LHN0cmluZyksKHVpbnQ2NCxzdHJpbmcpLHVpbnQxMjgsdWludDEyOCkpIiwgbWV0aG9kICJlY2hvX3Jlc291cmNlX2J5X2luZGV4KGFzc2V0LGFwcGxpY2F0aW9uLGFjY291bnQpKHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiLCBtZXRob2QgImVjaG9fcmVzb3VyY2VfYnlfdmFsdWUodWludDY0LHVpbnQ2NCxhZGRyZXNzKSh1aW50NjQsdWludDY0LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggc2luayBzaW5rMiB3aXRoX3R4biB3aXRoX2Fzc2V0IHdpdGhfYXBwIHdpdGhfYWNjIGNvbXBsZXhfc2lnIGVjaG9fcmVzb3VyY2VfYnlfaW5kZXggZWNob19yZXNvdXJjZV9ieV92YWx1ZQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjUKICAgIC8vIGNsYXNzIFNpZ25hdHVyZXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4NGM1YzYxYmEgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOAogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkICE9IDAsICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQiCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozMC0zMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzICE9IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBnbG9iYWwgdG8gaGF2ZSBhcHAgYWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjgKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhcHBfdHhuLmFwcF9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBleHBlY3RlZCB0eG4gdG8gaGF2ZSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNAogICAgLy8gYXNzZXJ0IFR4bi5hcHBsaWNhdGlvbl9pZCA9PSAwLCAiZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdHhuIHRvIGhhdmUgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rW3JvdXRpbmddKCkgLT4gdm9pZDoKc2luazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QodmFsaWRhdGVfZW5jb2Rpbmc9InVuc2FmZV9kaXNhYmxlZCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDEKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHZhbGlkYXRlX2VuY29kaW5nPSJ1bnNhZmVfZGlzYWJsZWQiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5zaW5rMltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNpbmsyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJhbGlhcyIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NDcKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImFsaWFzIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF90eG5bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX3R4bjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTEKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTIKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IHBheS5ncm91cF9pbmRleCA9PSAwCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPT0gMQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPT0gMTIzCiAgICBndHhucyBBbW91bnQKICAgIGludGNfMyAvLyAxMjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hc3NldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhfYXNzZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdmFsdWUKICAgIHVuY292ZXIgMgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhc3NlcnQgYXJyCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjEKICAgIC8vIGFzc2VydCBhc3NldC50b3RhbCA9PSAxMjMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo2MgogICAgLy8gYXNzZXJ0IFR4bi5hc3NldHMoMCkgPT0gYXNzZXQKICAgIHR4bmEgQXNzZXRzIDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hcHBbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FwcDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCB2YWx1ZQogICAgdW5jb3ZlciAzCiAgICBieXRlY18wIC8vIDB4MDAwMAogICAgIT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBhcnIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFwcC5pZCA9PSBhcHBfaWQsICJleHBlY3RlZCBhcHAgaWQgdG8gbWF0Y2ggcHJvdmlkZWQgYXBwIGlkIgogICAgZGlnIDEKICAgIGl0b2IKICAgIGI9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcCBpZCB0byBtYXRjaCBwcm92aWRlZCBhcHAgaWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgYXBwLmNyZWF0b3IgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvciIKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG90aGVyIGFwcCB0byBoYXZlIHNhbWUgY3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6NzIKICAgIC8vIGFwcF90eG4gPSBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uKDApCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjczCiAgICAvLyBhc3NlcnQgYXBwX3R4bi5hcHBzKDApID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkCiAgICBkdXAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25zCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygwKSA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgdHhuYSBBcHBsaWNhdGlvbnMgMAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3MgogICAgLy8gYXBwX3R4biA9IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24oMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IGFwcF90eG4uYXBwcygxKSA9PSBhcHAKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9ucwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9ucygxKSA9PSBhcHAKICAgIHR4bmEgQXBwbGljYXRpb25zIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3Qud2l0aF9hY2Nbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoX2FjYzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MAogICAgLy8gYXNzZXJ0IHZhbHVlCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzAgLy8gMHgwMDAwCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IGFycgogICAgYnl0ZWNfMCAvLyAweDAwMDAKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhc3NlcnQgYWNjLmJhbGFuY2UgPT0gYWNjLm1pbl9iYWxhbmNlICsgMTIzNAogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBwdXNoaW50IDEyMzQKICAgICsKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBhc3NlcnQgVHhuLmFjY291bnRzKDApID09IFR4bi5zZW5kZXIKICAgIHR4bmEgQWNjb3VudHMgMAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6ODQKICAgIC8vIGFzc2VydCBUeG4uYWNjb3VudHMoMSkgPT0gYWNjCiAgICB0eG5hIEFjY291bnRzIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuY29tcGxleF9zaWdbcm91dGluZ10oKSAtPiB2b2lkOgpjb21wbGV4X3NpZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBmaXZlLnZhbGlkYXRlKCkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IFR4bi5udW1fYXBwX2FyZ3MgPT0gNAogICAgdHhuIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgc3RydWN0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC5vbmUgPT0gMQogICAgZGlnIDMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjkyLTk0CiAgICAvLyAjIHN0cnVjdAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3Qub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdC50d28gPT0gIjIiCiAgICBieXRlY18zIC8vIDB4MDAwMTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIGRpZyA2CiAgICBsZW4KICAgIGRpZyA3CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NS05NgogICAgLy8gYXNzZXJ0IHN0cnVjdDEuYW5vdGhlcl9zdHJ1Y3RfYWxpYXMub25lID09IDEKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0X2FsaWFzLnR3byA9PSAiMiIKICAgIGR1cAogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6OTQKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmFub3RoZXJfc3RydWN0LnR3byA9PSAiMiIKICAgIGJ5dGVjXzMgLy8gMHgwMDAxMzIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBhc3NlcnQgc3RydWN0MS5hbm90aGVyX3N0cnVjdF9hbGlhcy50d28gPT0gIjIiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHN0cnVjdDEudGhyZWUgPT0gMwogICAgZGlnIDUKICAgIGV4dHJhY3QgNCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weTo5OAogICAgLy8gYXNzZXJ0IHN0cnVjdDEuZm91ciA9PSA0CiAgICBkaWcgNQogICAgZXh0cmFjdCAyMCAxNgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIHR4bgogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBUeG4uZ3JvdXBfaW5kZXggLSAxCiAgICB1bmNvdmVyIDQKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTAzLTEwNAogICAgLy8gIyBhY2MKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygyKSA9PSBhcmM0LlVJbnQ4KDEpLmJ5dGVzICAjIGFjYyBhcnJheSByZWYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHB1c2hieXRlcyAweDAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhY2MuYmFsYW5jZSA9PSBhY2MubWluX2JhbGFuY2UgKyAxMjM0CiAgICBkaWcgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHVuY292ZXIgNAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHB1c2hpbnQgMTIzNAogICAgKwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgZml2ZVswXSA9PSA1CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAxCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHB1c2hpbnQgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuQXJjNEFCSU1ldGhvZC5jb250cmFjdC5TaWduYXR1cmVzQ29udHJhY3QuZWNob19yZXNvdXJjZV9ieV9pbmRleFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmVjaG9fcmVzb3VyY2VfYnlfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NldF9pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYXNzZXQgPT0gVHhuLmFzc2V0cyhhc3NldF9pZHgpLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQXNzZXRzCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBwYXNzZWQgYnkgaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjExOAogICAgLy8gYXBwX2lkeCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMikpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTkKICAgIC8vIGFzc2VydCBhcHAgPT0gVHhuLmFwcGxpY2F0aW9ucyhhcHBfaWR4KSwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSBpbmRleCIKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXBwbGljYXRpb24gdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjAKICAgIC8vIGFjY19pZHggPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDMpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTIxCiAgICAvLyBhc3NlcnQgYWNjID09IFR4bi5hY2NvdW50cyhhY2NfaWR4KSwgImV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4IgogICAgdHhuYXMgQWNjb3VudHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IGluZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5BcmM0QUJJTWV0aG9kLmNvbnRyYWN0LlNpZ25hdHVyZXNDb250cmFjdC5lY2hvX3Jlc291cmNlX2J5X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZWNob19yZXNvdXJjZV9ieV92YWx1ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0idmFsdWUiLAogICAgLy8gKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMwCiAgICAvLyBhY2MudmFsaWRhdGUoKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMxCiAgICAvLyBhc3NldF9pZCA9IG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBhc3NldC5pZCA9PSBhc3NldF9pZCwgImV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTMzCiAgICAvLyBhcHBfaWQgPSBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDIpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM0CiAgICAvLyBhc3NlcnQgYXBwLmlkID09IGFwcF9pZCwgImV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFwcGxpY2F0aW9uIHRvIGJlIHBhc3NlZCBieSB2YWx1ZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM2CiAgICAvLyBhc3NlcnQgYWNjLmJ5dGVzID09IGFkZHJlc3MsICJleHBlY3RlZCBhY2NvdW50IHRvIGJlIHBhc3NlZCBieSB2YWx1ZSIKICAgIGR1cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL0FyYzRBQklNZXRob2QvY29udHJhY3QucHk6MTM1CiAgICAvLyBhZGRyZXNzID0gVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMykKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9BcmM0QUJJTWV0aG9kL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYXNzZXJ0IGFjYy5ieXRlcyA9PSBhZGRyZXNzLCAiZXhwZWN0ZWQgYWNjb3VudCB0byBiZSBwYXNzZWQgYnkgdmFsdWUiCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFjY291bnQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvQXJjNEFCSU1ldGhvZC9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9InZhbHVlIiwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkE4Yki2AQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==", + "approval": "CyAEAQAGeyYEAgAABBUffHUIAAAAAAAAAAEDAAEyMRkURDEYQQBHggkELgF4HgQ7Bc8XBAZY3MMEW2RH3gQGH053BOqokTkEUQ5ypATWwqx/BEgULV42GgCOCQApADcARQBuAJAA2AEJAeMCIgCABExcYbo2GgCOAQABACM4ECQSRDIIRDIKMgMTRCM4GBREMRgURCJDNhoCNhoBKBNEKBNEIkM2GgI2GgEoE0QoE0QiQzYaATEWIglJOBAiEkQ2GgJPAigTRCgTREk4FhREMRYiEkQ4CCUSRCJDNhoBNhoCF8AwNhoDTwIoE0QoE0RJcQBEJRJENjAAEkQiQzYaATYaAhfAMjYaAzYaBE8DKBNEKBNESwEWqERJcgdEMgkSRCM4ECQSRCNJwjIyCBJENjIAMggSRCMiwjJLARJENjIBEkQiQzYaATYaAhfAHDYaA08CKBNEKBNESXMAREsBcwFEgdIJCBJENhwAMQASRDYcARJEIkM2GgExFiIJNhoCF8AcNhoDSSNZgQIISwEVEkQxG4EEEkRLAyNZSwSBAllLBU8CSwJSSVcACCqoREmBCFlLARVLAk8CSwJSKxJESwYVSwdPBE8CUklXAAgqqERJgQhZSwEVUisSREsFVwQQgBAAAAAAAAAAAAAAAAAAAAADqERLBVcUEIAQAAAAAAAAAAAAAAAAAAAABKhETwQ4FjEWIgkSRDYaAoABARJESwNzAERPBHMBRIHSCQgSRE8CVwIBgAEFqESBBAgWVwYCgAIABExQTFBMUClMULAiQzYaARfAMDYaAhfAMjYaAxfAHDYaARfAMEsDEkQ2GgIXwDJLAhJENhoDF8AcSwESRE8CFk8CFlBMUClMULAiQzYaARc2GgIXNhoDSRWBIBJENhoBF0sDEkQ2GgIXSwISREk2GgMSRE8CFk8CFlBMUClMULAiQw==", "clear": "C4EBQw==" }, "compilerInfo": { diff --git a/tests/artifacts/PrimitiveOps/contract.py b/tests/artifacts/PrimitiveOps/contract.py index 1f4d6272..77614258 100644 --- a/tests/artifacts/PrimitiveOps/contract.py +++ b/tests/artifacts/PrimitiveOps/contract.py @@ -1,6 +1,6 @@ import typing -from algopy import ARC4Contract, BigUInt, Bytes, String, UInt64, arc4, log, op +from algopy import ARC4Contract, BigUInt, Bytes, FixedBytes, String, UInt64, arc4, log, op class PrimitiveOpsContract(ARC4Contract): @@ -364,9 +364,10 @@ def verify_log( # noqa: PLR0913 k: Bytes, m: Bytes, n: Bytes, + o: FixedBytes[typing.Literal[5]], ) -> None: d_biguint = BigUInt.from_bytes(d) arc4_k = arc4.StaticArray[arc4.UInt8, typing.Literal[3]].from_bytes(k) arc4_m = arc4.DynamicArray[arc4.UInt16].from_bytes(m) arc4_n = arc4.Tuple[arc4.UInt32, arc4.UInt64, arc4.String].from_bytes(n) - log(a, b, c, d_biguint, e, f, g, h, i, j, arc4_k, arc4_m, arc4_n, sep="-") + log(a, b, c, d_biguint, e, f, g, h, i, j, arc4_k, arc4_m, arc4_n, o, sep="-") diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal index b2be54d7..6216495e 100644 --- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal @@ -14,7 +14,7 @@ main: assert txn ApplicationID assert - pushbytess 0x725c692b 0x17314559 0x53f34893 0x88c8b269 0xa464b7ab 0x9c8b11b8 0x6f40654e 0xec9a2974 0xc793708f 0x7ddb7499 0xa21c443d 0x6e7fb212 0xb007fcb0 0x2ebc20d4 0xb0954b66 0xdd140aef 0xace474da 0xba694990 0x6db581c0 0x91c8db89 0xdbe77158 0x9a0f22e1 0x64033d37 0x2a7237c5 0xe3a94458 0x42f87f7d 0x2b5542a4 0x9be2fbe9 0x1cd92515 0x64e1705c 0xf1271c50 0x2ab63b70 0x834bb7d2 0x531620d7 0x3fb9e769 0xfa8db0bc 0xa72ea485 0xb7b0ba19 0x74460c42 0xab320738 0x52ad4654 0x10156399 0x0f075957 0xbd843dff 0xb377d381 0x89767265 0x456b4b23 0x33d1b88c 0x6bf973ea 0x67cd6bb2 0x3f58805a 0x1e130039 0x509dc91d 0xa564a202 0x23650763 0xf8c8f8d5 0x23faf7a4 0x7d0afe15 0x48581adf 0xe007c10b // method "verify_uint64_init(byte[])uint64", method "verify_uint64_add(uint64,uint64)uint64", method "verify_uint64_sub(uint64,uint64)uint64", method "verify_uint64_mul(uint64,uint64)uint64", method "verify_uint64_div(uint64,uint64)uint64", method "verify_uint64_mod(uint64,uint64)uint64", method "verify_uint64_and(uint64,uint64)uint64", method "verify_uint64_or(uint64,uint64)uint64", method "verify_uint64_xor(uint64,uint64)uint64", method "verify_uint64_not(uint64)uint64", method "verify_uint64_lshift(uint64,uint64)uint64", method "verify_uint64_rshift(uint64,uint64)uint64", method "verify_uint64_pow(uint64,uint64)uint64", method "verify_uint64_eq(uint64,uint64)bool", method "verify_uint64_ne(uint64,uint64)bool", method "verify_uint64_lt(uint64,uint64)bool", method "verify_uint64_le(uint64,uint64)bool", method "verify_uint64_gt(uint64,uint64)bool", method "verify_uint64_ge(uint64,uint64)bool", method "verify_bytes_init(uint64)byte[]", method "verify_bytes_add(byte[],byte[],uint64,uint64)byte[]", method "verify_bytes_eq(byte[],byte[])bool", method "verify_bytes_ne(byte[],byte[])bool", method "verify_bytes_and(byte[],byte[])byte[]", method "verify_bytes_or(byte[],byte[])byte[]", method "verify_bytes_xor(byte[],byte[])byte[]", method "verify_bytes_not(byte[],uint64)byte[]", method "verify_biguint_add(byte[],byte[])byte[]", method "verify_biguint_add_uint64(byte[],uint64)byte[]", method "verify_biguint_sub(byte[],byte[])byte[]", method "verify_biguint_sub_uint64(byte[],uint64)byte[]", method "verify_biguint_mul(byte[],byte[])byte[]", method "verify_biguint_mul_uint64(byte[],uint64)byte[]", method "verify_biguint_div(byte[],byte[])byte[]", method "verify_biguint_div_uint64(byte[],uint64)byte[]", method "verify_biguint_mod(byte[],byte[])byte[]", method "verify_biguint_mod_uint64(byte[],uint64)byte[]", method "verify_biguint_and(byte[],byte[])byte[]", method "verify_biguint_and_uint64(byte[],uint64)byte[]", method "verify_biguint_or(byte[],byte[])byte[]", method "verify_biguint_or_uint64(byte[],uint64)byte[]", method "verify_biguint_xor(byte[],byte[])byte[]", method "verify_biguint_xor_uint64(byte[],uint64)byte[]", method "verify_biguint_eq(byte[],byte[])bool", method "verify_biguint_eq_uint64(byte[],uint64)bool", method "verify_biguint_ne(byte[],byte[])bool", method "verify_biguint_ne_uint64(byte[],uint64)bool", method "verify_biguint_lt(byte[],byte[])bool", method "verify_biguint_lt_uint64(byte[],uint64)bool", method "verify_biguint_le(byte[],byte[])bool", method "verify_biguint_le_uint64(byte[],uint64)bool", method "verify_biguint_gt(byte[],byte[])bool", method "verify_biguint_gt_uint64(byte[],uint64)bool", method "verify_biguint_ge(byte[],byte[])bool", method "verify_biguint_ge_uint64(byte[],uint64)bool", method "verify_string_init(string)string", method "verify_string_startswith(string,string)bool", method "verify_string_endswith(string,string)bool", method "verify_string_join(string,string)string", method "verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[])void" + pushbytess 0x725c692b 0x17314559 0x53f34893 0x88c8b269 0xa464b7ab 0x9c8b11b8 0x6f40654e 0xec9a2974 0xc793708f 0x7ddb7499 0xa21c443d 0x6e7fb212 0xb007fcb0 0x2ebc20d4 0xb0954b66 0xdd140aef 0xace474da 0xba694990 0x6db581c0 0x91c8db89 0xdbe77158 0x9a0f22e1 0x64033d37 0x2a7237c5 0xe3a94458 0x42f87f7d 0x2b5542a4 0x9be2fbe9 0x1cd92515 0x64e1705c 0xf1271c50 0x2ab63b70 0x834bb7d2 0x531620d7 0x3fb9e769 0xfa8db0bc 0xa72ea485 0xb7b0ba19 0x74460c42 0xab320738 0x52ad4654 0x10156399 0x0f075957 0xbd843dff 0xb377d381 0x89767265 0x456b4b23 0x33d1b88c 0x6bf973ea 0x67cd6bb2 0x3f58805a 0x1e130039 0x509dc91d 0xa564a202 0x23650763 0xf8c8f8d5 0x23faf7a4 0x7d0afe15 0x48581adf 0x3daef9cd // method "verify_uint64_init(byte[])uint64", method "verify_uint64_add(uint64,uint64)uint64", method "verify_uint64_sub(uint64,uint64)uint64", method "verify_uint64_mul(uint64,uint64)uint64", method "verify_uint64_div(uint64,uint64)uint64", method "verify_uint64_mod(uint64,uint64)uint64", method "verify_uint64_and(uint64,uint64)uint64", method "verify_uint64_or(uint64,uint64)uint64", method "verify_uint64_xor(uint64,uint64)uint64", method "verify_uint64_not(uint64)uint64", method "verify_uint64_lshift(uint64,uint64)uint64", method "verify_uint64_rshift(uint64,uint64)uint64", method "verify_uint64_pow(uint64,uint64)uint64", method "verify_uint64_eq(uint64,uint64)bool", method "verify_uint64_ne(uint64,uint64)bool", method "verify_uint64_lt(uint64,uint64)bool", method "verify_uint64_le(uint64,uint64)bool", method "verify_uint64_gt(uint64,uint64)bool", method "verify_uint64_ge(uint64,uint64)bool", method "verify_bytes_init(uint64)byte[]", method "verify_bytes_add(byte[],byte[],uint64,uint64)byte[]", method "verify_bytes_eq(byte[],byte[])bool", method "verify_bytes_ne(byte[],byte[])bool", method "verify_bytes_and(byte[],byte[])byte[]", method "verify_bytes_or(byte[],byte[])byte[]", method "verify_bytes_xor(byte[],byte[])byte[]", method "verify_bytes_not(byte[],uint64)byte[]", method "verify_biguint_add(byte[],byte[])byte[]", method "verify_biguint_add_uint64(byte[],uint64)byte[]", method "verify_biguint_sub(byte[],byte[])byte[]", method "verify_biguint_sub_uint64(byte[],uint64)byte[]", method "verify_biguint_mul(byte[],byte[])byte[]", method "verify_biguint_mul_uint64(byte[],uint64)byte[]", method "verify_biguint_div(byte[],byte[])byte[]", method "verify_biguint_div_uint64(byte[],uint64)byte[]", method "verify_biguint_mod(byte[],byte[])byte[]", method "verify_biguint_mod_uint64(byte[],uint64)byte[]", method "verify_biguint_and(byte[],byte[])byte[]", method "verify_biguint_and_uint64(byte[],uint64)byte[]", method "verify_biguint_or(byte[],byte[])byte[]", method "verify_biguint_or_uint64(byte[],uint64)byte[]", method "verify_biguint_xor(byte[],byte[])byte[]", method "verify_biguint_xor_uint64(byte[],uint64)byte[]", method "verify_biguint_eq(byte[],byte[])bool", method "verify_biguint_eq_uint64(byte[],uint64)bool", method "verify_biguint_ne(byte[],byte[])bool", method "verify_biguint_ne_uint64(byte[],uint64)bool", method "verify_biguint_lt(byte[],byte[])bool", method "verify_biguint_lt_uint64(byte[],uint64)bool", method "verify_biguint_le(byte[],byte[])bool", method "verify_biguint_le_uint64(byte[],uint64)bool", method "verify_biguint_gt(byte[],byte[])bool", method "verify_biguint_gt_uint64(byte[],uint64)bool", method "verify_biguint_ge(byte[],byte[])bool", method "verify_biguint_ge_uint64(byte[],uint64)bool", method "verify_string_init(string)string", method "verify_string_startswith(string,string)bool", method "verify_string_endswith(string,string)bool", method "verify_string_join(string,string)string", method "verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[],byte[5])void" txna ApplicationArgs 0 match verify_uint64_init verify_uint64_add verify_uint64_sub verify_uint64_mul verify_uint64_div verify_uint64_mod verify_uint64_and verify_uint64_or verify_uint64_xor verify_uint64_not verify_uint64_lshift verify_uint64_rshift verify_uint64_pow verify_uint64_eq verify_uint64_ne verify_uint64_lt verify_uint64_le verify_uint64_gt verify_uint64_ge verify_bytes_init verify_bytes_add verify_bytes_eq verify_bytes_ne verify_bytes_and verify_bytes_or verify_bytes_xor verify_bytes_not verify_biguint_add verify_biguint_add_uint64 verify_biguint_sub verify_biguint_sub_uint64 verify_biguint_mul verify_biguint_mul_uint64 verify_biguint_div verify_biguint_div_uint64 verify_biguint_mod verify_biguint_mod_uint64 verify_biguint_and verify_biguint_and_uint64 verify_biguint_or verify_biguint_or_uint64 verify_biguint_xor verify_biguint_xor_uint64 verify_biguint_eq verify_biguint_eq_uint64 verify_biguint_ne verify_biguint_ne_uint64 verify_biguint_lt verify_biguint_lt_uint64 verify_biguint_le verify_biguint_le_uint64 verify_biguint_gt verify_biguint_gt_uint64 verify_biguint_ge verify_biguint_ge_uint64 verify_string_init verify_string_startswith verify_string_endswith verify_string_join verify_log err @@ -1608,16 +1608,21 @@ verify_log: extract 2 0 txna ApplicationArgs 13 extract 2 0 - // tests/artifacts/PrimitiveOps/contract.py:372 - // log(a, b, c, d_biguint, e, f, g, h, i, j, arc4_k, arc4_m, arc4_n, sep="-") - uncover 12 + txna ApplicationArgs 14 + // tests/artifacts/PrimitiveOps/contract.py:373 + // log(a, b, c, d_biguint, e, f, g, h, i, j, arc4_k, arc4_m, arc4_n, o, sep="-") + uncover 13 bytec_2 // "-" concat - uncover 12 + uncover 13 itob concat bytec_2 // "-" concat + uncover 12 + concat + bytec_2 // "-" + concat uncover 11 concat bytec_2 // "-" diff --git a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json index d39518dd..d27eb7f4 100644 --- a/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json +++ b/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json @@ -1523,6 +1523,10 @@ { "type": "byte[]", "name": "n" + }, + { + "type": "byte[5]", + "name": "o" } ], "returns": { @@ -1583,11 +1587,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHhlMDA3YzEwYiAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCB2ZXJpZnlfdWludDY0X2luaXQgdmVyaWZ5X3VpbnQ2NF9hZGQgdmVyaWZ5X3VpbnQ2NF9zdWIgdmVyaWZ5X3VpbnQ2NF9tdWwgdmVyaWZ5X3VpbnQ2NF9kaXYgdmVyaWZ5X3VpbnQ2NF9tb2QgdmVyaWZ5X3VpbnQ2NF9hbmQgdmVyaWZ5X3VpbnQ2NF9vciB2ZXJpZnlfdWludDY0X3hvciB2ZXJpZnlfdWludDY0X25vdCB2ZXJpZnlfdWludDY0X2xzaGlmdCB2ZXJpZnlfdWludDY0X3JzaGlmdCB2ZXJpZnlfdWludDY0X3BvdyB2ZXJpZnlfdWludDY0X2VxIHZlcmlmeV91aW50NjRfbmUgdmVyaWZ5X3VpbnQ2NF9sdCB2ZXJpZnlfdWludDY0X2xlIHZlcmlmeV91aW50NjRfZ3QgdmVyaWZ5X3VpbnQ2NF9nZSB2ZXJpZnlfYnl0ZXNfaW5pdCB2ZXJpZnlfYnl0ZXNfYWRkIHZlcmlmeV9ieXRlc19lcSB2ZXJpZnlfYnl0ZXNfbmUgdmVyaWZ5X2J5dGVzX2FuZCB2ZXJpZnlfYnl0ZXNfb3IgdmVyaWZ5X2J5dGVzX3hvciB2ZXJpZnlfYnl0ZXNfbm90IHZlcmlmeV9iaWd1aW50X2FkZCB2ZXJpZnlfYmlndWludF9hZGRfdWludDY0IHZlcmlmeV9iaWd1aW50X3N1YiB2ZXJpZnlfYmlndWludF9zdWJfdWludDY0IHZlcmlmeV9iaWd1aW50X211bCB2ZXJpZnlfYmlndWludF9tdWxfdWludDY0IHZlcmlmeV9iaWd1aW50X2RpdiB2ZXJpZnlfYmlndWludF9kaXZfdWludDY0IHZlcmlmeV9iaWd1aW50X21vZCB2ZXJpZnlfYmlndWludF9tb2RfdWludDY0IHZlcmlmeV9iaWd1aW50X2FuZCB2ZXJpZnlfYmlndWludF9hbmRfdWludDY0IHZlcmlmeV9iaWd1aW50X29yIHZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NCB2ZXJpZnlfYmlndWludF94b3IgdmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9lcSB2ZXJpZnlfYmlndWludF9lcV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbmUgdmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0IHZlcmlmeV9iaWd1aW50X2x0IHZlcmlmeV9iaWd1aW50X2x0X3VpbnQ2NCB2ZXJpZnlfYmlndWludF9sZSB2ZXJpZnlfYmlndWludF9sZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ3QgdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0IHZlcmlmeV9iaWd1aW50X2dlIHZlcmlmeV9iaWd1aW50X2dlX3VpbnQ2NCB2ZXJpZnlfc3RyaW5nX2luaXQgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGggdmVyaWZ5X3N0cmluZ19qb2luIHZlcmlmeV9sb2cKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA2NzoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2luaXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5CiAgICAvLyByZXN1bHQgPSBvcC5idG9pKHJhd192YWx1ZSkKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYWRkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNAogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgICsKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfc3ViOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTkKICAgIC8vIHJlc3VsdCA9IGEgLSBiCiAgICAtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9tdWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyByZXN1bHQgPSBhICogYgogICAgKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZGl2W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9kaXY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOQogICAgLy8gcmVzdWx0ID0gYSAvLyBiCiAgICAvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9tb2Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X21vZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSBhICUgYgogICAgJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9hbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozOQogICAgLy8gcmVzdWx0ID0gYSAmIGIKICAgICYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X29yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXN1bHQgPSBhIHwgYgogICAgfAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0OQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIF4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25vdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbm90OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTQKICAgIC8vIHJlc3VsdCA9IH5hCiAgICB+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9sc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyByZXN1bHQgPSBhIDw8IGIKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcnNoaWZ0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9yc2hpZnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2NAogICAgLy8gcmVzdWx0ID0gYSA+PiBiCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X3Bvd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfcG93OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjkKICAgIC8vIHJlc3VsdCA9IGEqKmIKICAgIGV4cAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzQKICAgIC8vIHJlc3VsdCA9IGEgPT0gYgogICAgPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3OQogICAgLy8gcmVzdWx0ID0gYSAhPSBiCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2x0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyByZXN1bHQgPSBhIDwgYgogICAgPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyByZXN1bHQgPSBhIDw9IGIKICAgIDw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZ3Rbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTQKICAgIC8vIHJlc3VsdCA9IGEgPiBiCiAgICA+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2dlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTkKICAgIC8vIHJlc3VsdCA9IGEgPj0gYgogICAgPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2luaXRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDQKICAgIC8vIHJlc3VsdCA9IG9wLml0b2IocmF3X3ZhbHVlKQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYWRkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9hX3NpemUpICsgYQogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYiA9IG9wLmJ6ZXJvKHBhZF9iX3NpemUpICsgYgogICAgc3dhcAogICAgYnplcm8KICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gcmVzdWx0ID0gYSArIGIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTQKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gcmVzdWx0ID0gYSAmIGIKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfb3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX3hvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc194b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIHJlc3VsdCA9IGEgXiBiCiAgICBiXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX25vdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gYSA9IG9wLmJ6ZXJvKHBhZF9zaXplKSArIGEKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ1CiAgICAvLyByZXN1bHQgPSB+YQogICAgYn4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ2CiAgICAvLyByZXN1bHQgPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NTAwMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCArIGJfYmlndWludAogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9hZGRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCArIGIKICAgIGl0b2IKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9zdWJbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAtIGJfYmlndWludAogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9zdWJfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAtIGIKICAgIGl0b2IKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tdWxbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9tdWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAqIGJfYmlndWludAogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9tdWxfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxODUKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAqIGIKICAgIGl0b2IKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiX2JpZ3VpbnQKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9kaXZfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgLy8gYgogICAgaXRvYgogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X21vZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwNQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICUgYl9iaWd1aW50CiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICUgYgogICAgaXRvYgogICAgYiUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICYgYl9iaWd1aW50CiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICYgYgogICAgaXRvYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGJfYmlndWludAogICAgYnwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjM3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgfCBiCiAgICBpdG9iCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfeG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgXiBiX2JpZ3VpbnQKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgXiBiCiAgICBpdG9iCiAgICBiXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZXFbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID09IGJfYmlndWludAogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9lcV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID09IGIKICAgIGl0b2IKICAgIGI9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICE9IGJfYmlndWludAogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9uZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICE9IGIKICAgIGl0b2IKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYl9iaWd1aW50CiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyODkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8IGIKICAgIGl0b2IKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPD0gYl9iaWd1aW50CiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzAyCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPD0gYgogICAgaXRvYgogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA5CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiX2JpZ3VpbnQKICAgIGI+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9ndF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9ndF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxNQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID4gYgogICAgaXRvYgogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2dlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+PSBiCiAgICBpdG9iCiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gcmVzdWx0ID0gU3RyaW5nKCJIZWxsbywgIikgKyBhCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGhbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmVzdWx0ID0gYS5zdGFydHN3aXRoKGIpCiAgICBsZW4KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDMKICAgIGludGNfMSAvLyAwCgp2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGhfdGVybmFyeV9tZXJnZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmVzdWx0ID0gYS5zdGFydHN3aXRoKGIpCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDIKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQKCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfZW5kc3dpdGhbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2VuZHN3aXRoOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDMKICAgIC8vIHJlc3VsdCA9IGEuZW5kc3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+CiAgICBieiB2ZXJpZnlfc3RyaW5nX2VuZHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDMKICAgIC8vIHJlc3VsdCA9IGEuZW5kc3dpdGgoYikKICAgIGR1cAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgLQogICAgZGlnIDUKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdDMKICAgIGRpZyAzCiAgICA9PQogICAgYiB2ZXJpZnlfc3RyaW5nX2VuZHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19qb2luW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19qb2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gcmVzdWx0ID0gU3RyaW5nKCIsICIpLmpvaW4oKGEsIGIpKQogICAgc3dhcAogICAgcHVzaGJ5dGVzICIsICIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2xvZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzIKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEyCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwICItIiAweDE1MWY3Yzc1MDAyMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVANjcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZjhjOGY4ZDUgMHgyM2ZhZjdhNCAweDdkMGFmZTE1IDB4NDg1ODFhZGYgMHgzZGFlZjljZCAvLyBtZXRob2QgInZlcmlmeV91aW50NjRfaW5pdChieXRlW10pdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FkZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9zdWIodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbXVsKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2Rpdih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tb2QodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYW5kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X29yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3hvcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ub3QodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcnNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3Bvdyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9lcSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbmUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2x0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ3QodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2dlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2luaXQodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FkZChieXRlW10sYnl0ZVtdLHVpbnQ2NCx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc194b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19ub3QoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWJfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWwoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2RpdihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2RfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXEoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3N0cmluZ19pbml0KHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aChzdHJpbmcsc3RyaW5nKWJvb2wiLCBtZXRob2QgInZlcmlmeV9zdHJpbmdfZW5kc3dpdGgoc3RyaW5nLHN0cmluZylib29sIiwgbWV0aG9kICJ2ZXJpZnlfc3RyaW5nX2pvaW4oc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdLGJ5dGVbNV0pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHZlcmlmeV91aW50NjRfaW5pdCB2ZXJpZnlfdWludDY0X2FkZCB2ZXJpZnlfdWludDY0X3N1YiB2ZXJpZnlfdWludDY0X211bCB2ZXJpZnlfdWludDY0X2RpdiB2ZXJpZnlfdWludDY0X21vZCB2ZXJpZnlfdWludDY0X2FuZCB2ZXJpZnlfdWludDY0X29yIHZlcmlmeV91aW50NjRfeG9yIHZlcmlmeV91aW50NjRfbm90IHZlcmlmeV91aW50NjRfbHNoaWZ0IHZlcmlmeV91aW50NjRfcnNoaWZ0IHZlcmlmeV91aW50NjRfcG93IHZlcmlmeV91aW50NjRfZXEgdmVyaWZ5X3VpbnQ2NF9uZSB2ZXJpZnlfdWludDY0X2x0IHZlcmlmeV91aW50NjRfbGUgdmVyaWZ5X3VpbnQ2NF9ndCB2ZXJpZnlfdWludDY0X2dlIHZlcmlmeV9ieXRlc19pbml0IHZlcmlmeV9ieXRlc19hZGQgdmVyaWZ5X2J5dGVzX2VxIHZlcmlmeV9ieXRlc19uZSB2ZXJpZnlfYnl0ZXNfYW5kIHZlcmlmeV9ieXRlc19vciB2ZXJpZnlfYnl0ZXNfeG9yIHZlcmlmeV9ieXRlc19ub3QgdmVyaWZ5X2JpZ3VpbnRfYWRkIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfc3ViIHZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbXVsIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZGl2IHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbW9kIHZlcmlmeV9iaWd1aW50X21vZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfYW5kIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfb3IgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0IHZlcmlmeV9iaWd1aW50X3hvciB2ZXJpZnlfYmlndWludF94b3JfdWludDY0IHZlcmlmeV9iaWd1aW50X2VxIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9uZSB2ZXJpZnlfYmlndWludF9uZV91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfbHQgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0IHZlcmlmeV9iaWd1aW50X2xlIHZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NCB2ZXJpZnlfYmlndWludF9ndCB2ZXJpZnlfYmlndWludF9ndF91aW50NjQgdmVyaWZ5X2JpZ3VpbnRfZ2UgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0IHZlcmlmeV9zdHJpbmdfaW5pdCB2ZXJpZnlfc3RyaW5nX3N0YXJ0c3dpdGggdmVyaWZ5X3N0cmluZ19lbmRzd2l0aCB2ZXJpZnlfc3RyaW5nX2pvaW4gdmVyaWZ5X2xvZwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDY3OgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkKICAgIC8vIHJlc3VsdCA9IG9wLmJ0b2kocmF3X3ZhbHVlKQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE0CiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfc3ViW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOQogICAgLy8gcmVzdWx0ID0gYSAtIGIKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIHJlc3VsdCA9IGEgKiBiCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9kaXZbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXN1bHQgPSBhIC8vIGIKICAgIC8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X21vZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIHJlc3VsdCA9IGEgJSBiCiAgICAlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIHJlc3VsdCA9IGEgfCBiCiAgICB8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXN1bHQgPSBhIF4gYgogICAgXgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NAogICAgLy8gcmVzdWx0ID0gfmEKICAgIH4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfbHNoaWZ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NTkKICAgIC8vIHJlc3VsdCA9IGEgPDwgYgogICAgc2hsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X3JzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXN1bHQgPSBhID4+IGIKICAgIHNocgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9wb3c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gcmVzdWx0ID0gYSoqYgogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gcmVzdWx0ID0gYSA9PSBiCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3VpbnQ2NF9uZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXN1bHQgPSBhICE9IGIKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbHRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODQKICAgIC8vIHJlc3VsdCA9IGEgPCBiCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbGVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfdWludDY0X2xlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODkKICAgIC8vIHJlc3VsdCA9IGEgPD0gYgogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9ndFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NAogICAgLy8gcmVzdWx0ID0gYSA+IGIKICAgID4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV91aW50NjRfZ2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gcmVzdWx0ID0gYSA+PSBiCiAgICA+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfaW5pdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmVzdWx0ID0gb3AuaXRvYihyYXdfdmFsdWUpCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwOAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hZGRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYWRkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTExCiAgICAvLyBhID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkgKyBhCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEyCiAgICAvLyBiID0gb3AuYnplcm8ocGFkX2Jfc2l6ZSkgKyBiCiAgICBzd2FwCiAgICBiemVybwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTEzCiAgICAvLyByZXN1bHQgPSBhICsgYgogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNAogICAgLy8gcmVzdWx0ID0gb3Auc2hhMjU2KHJlc3VsdCkKICAgIHNoYTI1NgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUwMDIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2VxW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXN1bHQgPSBhID09IGIKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbmVbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjQKICAgIC8vIHJlc3VsdCA9IGEgIT0gYgogICAgIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYnl0ZXNfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyByZXN1bHQgPSBhICYgYgogICAgYiYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19vcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gcmVzdWx0ID0gYSB8IGIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfeG9yW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gcmVzdWx0ID0gYSBeIGIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYnl0ZXNfbm90W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2J5dGVzX25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhID0gb3AuYnplcm8ocGFkX3NpemUpICsgYQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDUKICAgIC8vIHJlc3VsdCA9IH5hCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDYKICAgIC8vIHJlc3VsdCA9IG9wLnNoYTI1NihyZXN1bHQpCiAgICBzaGEyNTYKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBiKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICsgYgogICAgaXRvYgogICAgYisKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1YjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBiLQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC0gYgogICAgaXRvYgogICAgYi0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBiKgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ICogYgogICAgaXRvYgogICAgYioKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IC8vIGJfYmlndWludAogICAgYi8KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9kaXZfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTgKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCAvLyBiCiAgICBpdG9iCiAgICBiLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbW9kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiX2JpZ3VpbnQKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9tb2RfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjExCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJSBiCiAgICBpdG9iCiAgICBiJQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfYW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiX2JpZ3VpbnQKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9hbmRfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI0CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgJiBiCiAgICBpdG9iCiAgICBiJgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyMzcKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCB8IGIKICAgIGl0b2IKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF94b3Jbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgYl4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF94b3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTAKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCBeIGIKICAgIGl0b2IKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9lcVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjU3CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYl9iaWd1aW50CiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjYzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPT0gYgogICAgaXRvYgogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYl9iaWd1aW50CiAgICBiIT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjc2CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgIT0gYgogICAgaXRvYgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MjgzCiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPCBiX2JpZ3VpbnQKICAgIGI8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50IDwgYgogICAgaXRvYgogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTYKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGI8PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weToyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA8PSBiCiAgICBpdG9iCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2JpZ3VpbnRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE1CiAgICAvLyByZXN1bHQgPSBhX2JpZ3VpbnQgPiBiCiAgICBpdG9iCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGJfYmlndWludAogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjRbcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gcmVzdWx0ID0gYV9iaWd1aW50ID49IGIKICAgIGl0b2IKICAgIGI+PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19pbml0W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X3N0cmluZ19pbml0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzMzCiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIkhlbGxvLCAiKSArIGEKICAgIHB1c2hieXRlcyAiSGVsbG8sICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuUHJpbWl0aXZlT3BzLmNvbnRyYWN0LlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGxlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPgogICAgYnogdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMwogICAgaW50Y18xIC8vIDAKCnZlcmlmeV9zdHJpbmdfc3RhcnRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzM4CiAgICAvLyByZXN1bHQgPSBhLnN0YXJ0c3dpdGgoYikKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgPT0KICAgIGIgdmVyaWZ5X3N0cmluZ19zdGFydHN3aXRoX3Rlcm5hcnlfbWVyZ2VANAoKCi8vIHRlc3RzLmFydGlmYWN0cy5QcmltaXRpdmVPcHMuY29udHJhY3QuUHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3N0cmluZ19lbmRzd2l0aFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeV9zdHJpbmdfZW5kc3dpdGg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgbGVuCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMAoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdmVyaWZ5X3N0cmluZ19lbmRzd2l0aF90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gcmVzdWx0ID0gYS5lbmRzd2l0aChiKQogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgZGlnIDMKICAgID09CiAgICBiIHZlcmlmeV9zdHJpbmdfZW5kc3dpdGhfdGVybmFyeV9tZXJnZUA0CgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfc3RyaW5nX2pvaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlfc3RyaW5nX2pvaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvUHJpbWl0aXZlT3BzL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ4CiAgICAvLyByZXN1bHQgPSBTdHJpbmcoIiwgIikuam9pbigoYSwgYikpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgIiwgIgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlByaW1pdGl2ZU9wcy5jb250cmFjdC5QcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfbG9nW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5X2xvZzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1ByaW1pdGl2ZU9wcy9jb250cmFjdC5weTozNzMKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24sIG8sIHNlcD0iLSIpCiAgICB1bmNvdmVyIDEzCiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGJ5dGVjXzIgLy8gIi0iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBieXRlY18yIC8vICItIgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMiAvLyAiLSIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9QcmltaXRpdmVPcHMvY29udHJhY3QucHk6MzUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8E4AfBCzYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCAE8MKlBPDBZQKlBPC1AqUE8KUCpQTwlQKlBPCFAqUE8HUCpQTwZQKlBPBVAqUE8EUCpQTwNQKlBPAlAqUExQsCJD", + "approval": "CyACAQAmBAQVH3x1AQABLQYVH3x1ACAxG0EBszEZFEQxGESCPARyXGkrBBcxRVkEU/NIkwSIyLJpBKRkt6sEnIsRuARvQGVOBOyaKXQEx5NwjwR923SZBKIcRD0Ebn+yEgSwB/ywBC68INQEsJVLZgTdFArvBKzkdNoEumlJkARttYHABJHI24kE2+dxWASaDyLhBGQDPTcEKnI3xQTjqURYBEL4f30EK1VCpASb4vvpBBzZJRUEZOFwXATxJxxQBCq2O3AEg0u30gRTFiDXBD+552kE+o2wvASnLqSFBLewuhkEdEYMQgSrMgc4BFKtRlQEEBVjmQQPB1lXBL2EPf8Es3fTgQSJdnJlBEVrSyMEM9G4jARr+XPqBGfNa7IEP1iAWgQeEwA5BFCdyR0EpWSiAgQjZQdjBPjI+NUEI/r3pAR9Cv4VBEhYGt8EPa75zTYaAI48AAkAFwAnADcARwBXAGcAdwCHAJcAowCzAMMA0wDnAPsBDwEjATcBSwFdAYMBmwGzAc4B6QIEAhkCNAJOAmkCgwKeArgC0wLtAwgDIgM9A1cDcgOMA6cDwQPZA/AECAQfBDcETgRmBH0ElQSsBMQE2wT6BSsFZgWIADEZFDEYFBBDNhoBVwIAFxYoTFCwIkM2GgEXNhoCFwgWKExQsCJDNhoBFzYaAhcJFihMULAiQzYaARc2GgIXCxYoTFCwIkM2GgEXNhoCFwoWKExQsCJDNhoBFzYaAhcYFihMULAiQzYaARc2GgIXGhYoTFCwIkM2GgEXNhoCFxkWKExQsCJDNhoBFzYaAhcbFihMULAiQzYaARccFihMULAiQzYaARc2GgIXkBYoTFCwIkM2GgEXNhoCF5EWKExQsCJDNhoBFzYaAheUFihMULAiQzYaARc2GgIXEikjTwJUKExQsCJDNhoBFzYaAhcTKSNPAlQoTFCwIkM2GgEXNhoCFwwpI08CVChMULAiQzYaARc2GgIXDikjTwJUKExQsCJDNhoBFzYaAhcNKSNPAlQoTFCwIkM2GgEXNhoCFw8pI08CVChMULAiQzYaARcWgAYVH3x1AAhMULAiQzYaAVcCADYaAlcCADYaAxc2GgQXTK9PA1BMr08CUFABK0xQsCJDNhoBVwIANhoCVwIAEikjTwJUKExQsCJDNhoBVwIANhoCVwIAEykjTwJUKExQsCJDNhoBVwIANhoCVwIArEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIArUkVFlcGAkxQKExQsCJDNhoBVwIANhoCF69MUK4BK0xQsCJDNhoBVwIANhoCVwIAoEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxagSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgChSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqFJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKNJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWo0kVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAokkVFlcGAkxQKExQsCJDNhoBVwIANhoCFxaiSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCqSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFqpJFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKxJFRZXBgJMUChMULAiQzYaAVcCADYaAhcWrEkVFlcGAkxQKExQsCJDNhoBVwIANhoCVwIAq0kVFlcGAkxQKExQsCJDNhoBVwIANhoCFxarSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgJXAgCtSRUWVwYCTFAoTFCwIkM2GgFXAgA2GgIXFq1JFRZXBgJMUChMULAiQzYaAVcCADYaAlcCAKgpI08CVChMULAiQzYaAVcCADYaAhcWqCkjTwJUKExQsCJDNhoBVwIANhoCVwIAqSkjTwJUKExQsCJDNhoBVwIANhoCFxapKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCkKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqQpI08CVChMULAiQzYaAVcCADYaAlcCAKYpI08CVChMULAiQzYaAVcCADYaAhcWpikjTwJUKExQsCJDNhoBVwIANhoCVwIApSkjTwJUKExQsCJDNhoBVwIANhoCFxalKSNPAlQoTFCwIkM2GgFXAgA2GgJXAgCnKSNPAlQoTFCwIkM2GgFXAgA2GgIXFqcpI08CVChMULAiQzYaAVcCAIAHSGVsbG8sIExQSRUWVwYCTFAoTFCwIkM2GgFXAgBJNhoCVwIASU4CFUlPAhUNQQAMIykjTwJUKExQsCJDSwIjSwJYSwISQv/pNhoBVwIASTYaAlcCAElOAhVJTwIVSU4CDUEADCMpI08CVChMULAiQ0lLAklOAglLBUxPAlhLAxJC/+I2GgFXAgA2GgJXAgBMgAIsIFBMUEkVFlcGAkxQKExQsCJDNhoBVwIANhoCFzYaA1cCADYaBFcCADYaBTYaBjYaBzYaCDYaCTYaCjYaC1cCADYaDFcCADYaDVcCADYaDk8NKlBPDRZQKlBPDFAqUE8LUCpQTwpQKlBPCVAqUE8IUCpQTwdQKlBPBlAqUE8FUCpQTwRQKlBPA1AqUE8CUCpQTFCwIkM=", "clear": "C4EBQw==" }, "compilerInfo": { diff --git a/tests/primitives/test_fixed_bytes.py b/tests/primitives/test_fixed_bytes.py new file mode 100644 index 00000000..a59adcbb --- /dev/null +++ b/tests/primitives/test_fixed_bytes.py @@ -0,0 +1,666 @@ +import base64 +import typing + +import pytest +from _algopy_testing.constants import MAX_BYTES_SIZE +from _algopy_testing.primitives.bytes import Bytes +from _algopy_testing.primitives.fixed_bytes import FixedBytes +from _algopy_testing.primitives.uint64 import UInt64 + +from tests.util import int_to_bytes + + +def test_fixed_bytes_init_default() -> None: + """Test FixedBytes initialization with default values (all zeros).""" + fb8 = FixedBytes[typing.Literal[8]]() + assert fb8 == b"\x00" * 8 + assert len(fb8) == 8 + + fb32 = FixedBytes[typing.Literal[32]]() + assert fb32 == b"\x00" * 32 + assert len(fb32) == 32 + + +@pytest.mark.parametrize("value", [b"12345678", Bytes(b"12345678")]) +def test_fixed_bytes_init_with_bytes(value: bytes | Bytes) -> None: + """Test FixedBytes initialization with bytes value.""" + fb8 = FixedBytes[typing.Literal[8]](value) + assert fb8 == value + assert len(fb8) == 8 + assert fb8.length == 8 + + +@pytest.mark.parametrize( + ("value", "message"), + [ + (b"12345", "expected value of length 8, not 5"), + (Bytes(b"1234567890"), "expected value of length 8, not 10"), + ], +) +def test_fixed_bytes_init_wrong_length(value: bytes | Bytes, message: str) -> None: + """Test FixedBytes initialization raises TypeError for wrong length.""" + with pytest.raises(ValueError, match=message): + FixedBytes[typing.Literal[8]](value) + + +@pytest.mark.parametrize( + ("value", "expected"), + [ + (FixedBytes[typing.Literal[4]](b"\x00\x00\x00\x00"), True), + (FixedBytes[typing.Literal[4]](), True), + (FixedBytes[typing.Literal[0]].from_bytes(b"\x01\x00\x00\x00"), False), + (FixedBytes[typing.Literal[0]](), False), + ], +) +def test_fixed_bytes_bool( + value: FixedBytes, # type: ignore[type-arg] + expected: bool, # noqa: FBT001 +) -> None: + assert bool(value) == expected + + +@pytest.mark.parametrize( + ("index", "expected"), + [ + (-1, b"8"), + (-2, b"7"), + (-7, b"2"), + (-8, b"1"), + (0, b"1"), + (1, b"2"), + (4, b"5"), + (7, b"8"), + ], +) +def test_fixed_bytes_getitem_int(index: int, expected: bytes) -> None: + """Test FixedBytes __getitem__ with int index.""" + value = b"1234567890" + fb8 = FixedBytes[typing.Literal[8]].from_bytes(value) + result = fb8[index] + assert isinstance(result, Bytes) + assert result == expected + + +def test_fixed_bytes_getitem_uint64() -> None: + """Test FixedBytes __getitem__ with UInt64 index.""" + value = b"12345678" + fb8 = FixedBytes[typing.Literal[8]](value) + result = fb8[UInt64(3)] + assert isinstance(result, Bytes) + assert result == int_to_bytes(value[3]) + + +@pytest.mark.parametrize( + ("value", "slice_obj", "expected"), + [ + (b"12345678", slice(0, 4), b"1234"), + (b"12345678", slice(2, 6), b"3456"), + (b"12345678", slice(0, 8), b"12345678"), + (b"12345678", slice(4, 8), b"5678"), + (b"12345678", slice(1, 3), b"23"), + (b"12345678", slice(-4, None), b"5678"), + (b"12345678", slice(None, -1), b"1234567"), + (b"12345678", slice(-4, -1), b"567"), + (b"1234567890", slice(-4, None), b"5678"), + (b"1234567890", slice(None, -1), b"1234567"), + ], +) +def test_fixed_bytes_getitem_slice(value: bytes, slice_obj: slice, expected: bytes) -> None: + """Test FixedBytes __getitem__ with slice.""" + fb8 = FixedBytes[typing.Literal[8]].from_bytes(value) + result = fb8[slice_obj] + assert isinstance(result, Bytes) + assert result == expected + + +@pytest.mark.parametrize( + ("value", "expected"), + [ + (b"12345678", b"12345678"), + (b"1234567890", b"12345678"), + ], +) +def test_fixed_bytes_iter(value: bytes | Bytes, expected: bytes | Bytes) -> None: + """Test FixedBytes iteration.""" + fb8 = FixedBytes[typing.Literal[8]].from_bytes(value) + + result = Bytes() + for byte in fb8: + assert isinstance(byte, Bytes) + result += byte + + assert len(result) == len(expected) + assert result == expected + + +@pytest.mark.parametrize( + ("value", "expected"), + [ + (b"12345678", b"87654321"), + (b"1234567890", b"87654321"), + ], +) +def test_fixed_bytes_reversed(value: bytes | Bytes, expected: bytes | Bytes) -> None: + """Test FixedBytes reverse iteration.""" + fb8 = FixedBytes[typing.Literal[8]].from_bytes(value) + + result = Bytes() + for byte in reversed(fb8): + assert isinstance(byte, Bytes) + result += byte + + assert len(result) == len(expected) + assert result == expected + + +def test_fixed_bytes_from_base32() -> None: + """Test FixedBytes.from_base32 static method.""" + base32_str = "GEZDGNBV" # "12345" in base32 + expected = base64.b32decode(base32_str) + + a = FixedBytes[typing.Literal[5]].from_base32(base32_str) + assert a.value == expected + assert len(a) == 5 + + b: FixedBytes[typing.Literal[5]] = FixedBytes.from_base32(base32_str) + assert b.value == expected + assert len(b) == 5 + + with pytest.raises(ValueError, match="expected value of length 4, not 5"): + FixedBytes[typing.Literal[4]].from_base32(base32_str) + + +def test_fixed_bytes_from_base64() -> None: + """Test FixedBytes.from_base64 static method.""" + base64_str = "MTIzNDU2Nzg=" # "12345678" in base64 + expected = base64.b64decode(base64_str) + + a = FixedBytes[typing.Literal[8]].from_base64(base64_str) + assert a.value == expected + assert len(a) == 8 + + b: FixedBytes[typing.Literal[8]] = FixedBytes.from_base64(base64_str) + assert b.value == expected + assert len(b) == 8 + + with pytest.raises(ValueError, match="expected value of length 4, not 8"): + FixedBytes[typing.Literal[4]].from_base64(base64_str) + + +def test_fixed_bytes_from_hex() -> None: + """Test FixedBytes.from_hex static method.""" + hex_str = "0102030405060708" + expected = base64.b16decode(hex_str) + + a = FixedBytes[typing.Literal[8]].from_hex(hex_str) + assert a.value == expected + assert len(a) == 8 + + b: FixedBytes[typing.Literal[8]] = FixedBytes.from_hex(hex_str) + assert b.value == expected + assert len(b) == 8 + + with pytest.raises(ValueError, match="expected value of length 4, not 8"): + FixedBytes[typing.Literal[4]].from_hex(hex_str) + + +def test_fixed_bytes_from_bytes() -> None: + """Test FixedBytes.from_bytes class method.""" + value = b"12345678" + fb8 = FixedBytes[typing.Literal[8]].from_bytes(value) + assert fb8 == value + assert len(fb8) == 8 + assert fb8.length == 8 + + # no validation of input length + fb7 = FixedBytes[typing.Literal[7]].from_bytes(value) + assert fb7 == value + assert len(fb7) == 7 + assert fb7.length == 7 + + # no validation of input length + fb16 = FixedBytes[typing.Literal[16]].from_bytes(value) + assert fb16 == value + assert len(fb16) == 16 + assert fb16.length == 16 + + # no validation of input length + fb32 = FixedBytes[typing.Literal[32]].from_bytes(b"\x0f" * 4096) + assert fb32 == b"\x0f" * 4096 + assert len(fb32) == 32 + assert fb32.length == 32 + + with pytest.raises(ValueError, match="expected value length <= 4096, got: 4097"): + FixedBytes[typing.Literal[64]].from_bytes(b"\x0f" * 4097) + + +def test_fixed_bytes_from_bytes_with_bytes_object() -> None: + """Test FixedBytes.from_bytes class method with Bytes object.""" + value = Bytes(b"12345678") + fb8 = FixedBytes[typing.Literal[8]].from_bytes(value) + assert fb8 == value.value + assert len(fb8) == 8 + assert fb8.length == 8 + + # no validation of input length + fb7 = FixedBytes[typing.Literal[7]].from_bytes(value) + assert fb7 == value.value + assert len(fb7) == 7 + assert fb7.length == 7 + + # no validation of input length + fb16 = FixedBytes[typing.Literal[16]].from_bytes(value) + assert fb16 == value + assert len(fb16) == 16 + assert fb16.length == 16 + + +def test_fixed_bytes_bytes_property() -> None: + """Test FixedBytes.bytes property.""" + value = b"12345678" + fb = FixedBytes[typing.Literal[8]](value) + result = fb.bytes + assert isinstance(result, Bytes) + assert result == value + + +def test_fixed_bytes_single_byte_iteration() -> None: + """Test iterating over FixedBytes with minimal length.""" + fb1 = FixedBytes[typing.Literal[1]](b"x") + items = list(fb1) + assert len(items) == 1 + assert items[0] == int_to_bytes(ord(b"x")) + + +def test_fixed_bytes_slice_edge_cases() -> None: + """Test edge cases for FixedBytes slicing.""" + value = b"12345678" + fb8 = FixedBytes[typing.Literal[8]](value) + + # Empty slice + assert fb8[0:0] == b"" + + # Slice beyond bounds + assert fb8[0:100] == value + + # Reverse slice (empty result) + assert fb8[5:2] == b"" + + # Slice with step (Python slices support this) + assert fb8[::2] == value[::2] + + +@pytest.mark.parametrize( + ("other", "expected", "expected_len"), + [ + (FixedBytes[typing.Literal[5]](b"world"), b"testworld", 9), + (Bytes(b"data"), b"testdata", 8), + (b"123", b"test123", 7), + (b"", b"test", 4), + ], +) +def test_fixed_bytes_add( + other: FixedBytes[typing.Any] | Bytes | bytes, expected: bytes, expected_len: int +) -> None: + """Test FixedBytes __add__ with various types.""" + fb4 = FixedBytes[typing.Literal[4]](b"test") + + result = fb4 + other + assert isinstance(result, Bytes) + assert result == expected + assert len(result) == expected_len + + result = other + fb4 + assert isinstance(result, Bytes) + assert len(result) == expected_len + + +def test_fixed_bytes_radd_with_bytes_literal() -> None: + """Test FixedBytes __radd__ with bytes literal.""" + fb4 = FixedBytes[typing.Literal[4]](b"test") + + result = b"123" + fb4 + assert isinstance(result, Bytes) + assert result == b"123test" + assert len(result) == 7 + + result = fb4 + b"123" + assert isinstance(result, Bytes) + assert result == b"test123" + assert len(result) == 7 + + +def test_fixed_bytes_add_overflow() -> None: + """Test FixedBytes __add__ raises OverflowError when result exceeds MAX_BYTES_SIZE.""" + # Create a FixedBytes that's close to MAX_BYTES_SIZE + fb_large = FixedBytes[typing.Literal[4096]](b"x" * 4096) + + # Try to add bytes that would exceed MAX_BYTES_SIZE (4096 bytes) + with pytest.raises(OverflowError, match=r"\+ overflows"): + _ = fb_large + (b"y" * (MAX_BYTES_SIZE - 4095)) + + +@pytest.mark.parametrize( + ("other", "expected_equal"), + [ + (FixedBytes[typing.Literal[4]](b"test"), True), + (FixedBytes[typing.Literal[4]](b"diff"), False), + (FixedBytes[typing.Literal[3]].from_bytes(b"test"), False), + (Bytes(b"test"), True), + (Bytes(b"diff"), False), + (b"test", True), + (b"diff", False), + (b"testtest", False), # different length + (FixedBytes[typing.Literal[8]](b"testtest"), False), # different length + ("test", False), # invalid type + (123, False), # invalid type + ([1, 2, 3, 4], False), # invalid type + ], +) +def test_fixed_bytes_eq(other: typing.Any, *, expected_equal: bool) -> None: + """Test FixedBytes __eq__ and __ne__ with various types and values.""" + fb = FixedBytes[typing.Literal[4]](b"test") + + # Test __eq__ + assert (fb == other) is expected_equal + # Test __ne__ + assert (fb != other) is not expected_equal + + +@pytest.mark.parametrize( + ("a_value", "b_value", "expected"), + [ + (b"\xff\xff\xff\xff", b"\x0f\x0f\x0f\x0f", b"\x0f\x0f\x0f\x0f"), + (b"\xaa\xaa\xaa\xaa", b"\x55\x55\x55\x55", b"\x00\x00\x00\x00"), + (b"\xff\x00\xff\x00", b"\x0f\xf0\x0f\xf0", b"\x0f\x00\x0f\x00"), + (b"\x00\x00\x00\x00", b"\xff\xff\xff\xff", b"\x00\x00\x00\x00"), + (b"\xff\xff\xff\xff\xff", b"\x0f\x0f\x0f\x0f\x0f", b"\x0f\x0f\x0f\x0f\x0f"), + ], +) +def test_fixed_bytes_and(a_value: bytes, b_value: bytes, expected: bytes) -> None: + """Test FixedBytes __and__ (bitwise AND) with same length FixedBytes.""" + fb_a = FixedBytes[typing.Literal[4]].from_bytes(a_value) + fb_b = FixedBytes[typing.Literal[4]].from_bytes(b_value) + + result = fb_a & fb_b + # Same length should return FixedBytes + assert isinstance(result, FixedBytes) + assert result == expected + + +def test_fixed_bytes_and_with_bytes() -> None: + """Test FixedBytes __and__ with bytes literal.""" + fb = FixedBytes[typing.Literal[4]](b"\xff\xff\xff\xff") + + result = fb & b"\x0f\x0f\x0f\x0f" + assert isinstance(result, Bytes) + assert result == b"\x0f\x0f\x0f\x0f" + + result = b"\x0f\x0f\x0f\x0f" & fb + assert isinstance(result, Bytes) + assert result == b"\x0f\x0f\x0f\x0f" + + +def test_fixed_bytes_and_different_lengths() -> None: + """Test FixedBytes __and__ with different length operands.""" + fb4 = FixedBytes[typing.Literal[4]](b"\xff\xff\xff\xff") + fb2 = FixedBytes[typing.Literal[2]](b"\x0f\x0f") + + result = fb4 & fb2 + assert isinstance(result, Bytes) + # Shorter operand is zero-padded on the left + assert result == b"\x00\x00\x0f\x0f" + + result = fb2 & fb4 + assert isinstance(result, Bytes) + # Shorter operand is zero-padded on the left + assert result == b"\x00\x00\x0f\x0f" + + +@pytest.mark.parametrize( + ("a_value", "b_value", "expected"), + [ + (b"\xff\xff\xff\xff", b"\x0f\x0f\x0f\x0f", b"\xff\xff\xff\xff"), + (b"\xaa\xaa\xaa\xaa", b"\x55\x55\x55\x55", b"\xff\xff\xff\xff"), + (b"\xff\x00\xff\x00", b"\x0f\xf0\x0f\xf0", b"\xff\xf0\xff\xf0"), + (b"\x00\x00\x00\x00", b"\x00\x00\x00\x00", b"\x00\x00\x00\x00"), + (b"\xff\xff\xff\xff\xff", b"\x0f\x0f\x0f\x0f\x0f", b"\xff\xff\xff\xff\xff"), + ], +) +def test_fixed_bytes_or(a_value: bytes, b_value: bytes, expected: bytes) -> None: + """Test FixedBytes __or__ (bitwise OR) with same length FixedBytes.""" + fb_a = FixedBytes[typing.Literal[4]].from_bytes(a_value) + fb_b = FixedBytes[typing.Literal[4]].from_bytes(b_value) + + result = fb_a | fb_b + # Same length should return FixedBytes + assert isinstance(result, FixedBytes) + assert result == expected + + +def test_fixed_bytes_or_with_bytes() -> None: + """Test FixedBytes __or__ with bytes literal.""" + fb = FixedBytes[typing.Literal[4]](b"\x0f\x0f\x0f\x0f") + + result = fb | b"\xf0\xf0\xf0\xf0" + assert isinstance(result, Bytes) + assert result == b"\xff\xff\xff\xff" + + result = b"\xf0\xf0\xf0\xf0" | fb + assert isinstance(result, Bytes) + assert result == b"\xff\xff\xff\xff" + + +def test_fixed_bytes_or_different_lengths() -> None: + """Test FixedBytes __or__ with different length operands.""" + fb4 = FixedBytes[typing.Literal[4]](b"\xff\xff\x00\x00") + fb2 = FixedBytes[typing.Literal[2]](b"\x0f\x0f") + + result = fb4 | fb2 + assert isinstance(result, Bytes) + # Shorter operand is zero-padded on the left + assert result == b"\xff\xff\x0f\x0f" + + result = fb2 | fb4 + assert isinstance(result, Bytes) + # Shorter operand is zero-padded on the left + assert result == b"\xff\xff\x0f\x0f" + + +@pytest.mark.parametrize( + ("a_value", "b_value", "expected"), + [ + (b"\xff\xff\xff\xff", b"\x0f\x0f\x0f\x0f", b"\xf0\xf0\xf0\xf0"), + (b"\xaa\xaa\xaa\xaa", b"\x55\x55\x55\x55", b"\xff\xff\xff\xff"), + (b"\xff\x00\xff\x00", b"\x0f\xf0\x0f\xf0", b"\xf0\xf0\xf0\xf0"), + (b"\x00\x00\x00\x00", b"\x00\x00\x00\x00", b"\x00\x00\x00\x00"), + (b"\xff\xff\xff\xff\xff", b"\x0f\x0f\x0f\x0f\x0f", b"\xf0\xf0\xf0\xf0\xf0"), + ], +) +def test_fixed_bytes_xor(a_value: bytes, b_value: bytes, expected: bytes) -> None: + """Test FixedBytes __xor__ (bitwise XOR) with same length FixedBytes.""" + fb_a = FixedBytes[typing.Literal[4]].from_bytes(a_value) + fb_b = FixedBytes[typing.Literal[4]].from_bytes(b_value) + + result = fb_a ^ fb_b + # Same length should return FixedBytes + assert isinstance(result, FixedBytes) + assert result == expected + + +def test_fixed_bytes_xor_with_bytes() -> None: + """Test FixedBytes __xor__ with bytes literal.""" + fb = FixedBytes[typing.Literal[4]](b"\xff\xff\xff\xff") + + result = fb ^ b"\x0f\x0f\x0f\x0f" + assert isinstance(result, Bytes) + assert result == b"\xf0\xf0\xf0\xf0" + + result = b"\x0f\x0f\x0f\x0f" ^ fb + assert isinstance(result, Bytes) + assert result == b"\xf0\xf0\xf0\xf0" + + +def test_fixed_bytes_xor_different_lengths() -> None: + """Test FixedBytes __xor__ with different length operands.""" + fb4 = FixedBytes[typing.Literal[4]](b"\xff\xff\x00\x00") + fb2 = FixedBytes[typing.Literal[2]](b"\x0f\x0f") + + result = fb4 ^ fb2 + assert isinstance(result, Bytes) + # Shorter operand is zero-padded on the left + assert result == b"\xff\xff\x0f\x0f" + + result = fb2 ^ fb4 + assert isinstance(result, Bytes) + # Shorter operand is zero-padded on the left + assert result == b"\xff\xff\x0f\x0f" + + +@pytest.mark.parametrize( + ("value", "expected"), + [ + (b"\xff\xff\xff\xff", b"\x00\x00\x00\x00"), + (b"\x00\x00\x00\x00", b"\xff\xff\xff\xff"), + (b"\xaa\xaa\xaa\xaa", b"\x55\x55\x55\x55"), + (b"\x0f\xf0\x0f\xf0", b"\xf0\x0f\xf0\x0f"), + (b"\x0f\xf0\x0f\xf0\xf0", b"\xf0\x0f\xf0\x0f\x0f"), + ], +) +def test_fixed_bytes_invert(value: bytes, expected: bytes) -> None: + """Test FixedBytes __invert__ (bitwise NOT).""" + fb = FixedBytes[typing.Literal[4]].from_bytes(value) + + result = ~fb + assert isinstance(result, FixedBytes) + assert result == expected + + +@pytest.mark.parametrize( + ("haystack", "needle", "expected_contains"), + [ + (b"hello world", b"world", True), + (b"hello world", b"hello", True), + (b"hello world", b"o w", True), + (b"hello world", b"", True), # empty bytes is always contained + (b"hello world", b"x", False), + (b"hello world", b"Hello", False), # case sensitive + (b"hello world", b"worldx", False), # longer than substring + (b"\x00\x01\x02\x03" + b"\00" * 7, b"\x01\x02", True), + (b"\x00\x01\x02\x03" + b"\00" * 7, b"\x02\x03", True), + (b"\x00\x01\x02\x03" + b"\00" * 7, b"\x03\x04", False), + ], +) +def test_fixed_bytes_contains_with_bytes( + haystack: bytes, needle: bytes, *, expected_contains: bool +) -> None: + """Test FixedBytes __contains__ with bytes literal.""" + fb = FixedBytes[typing.Literal[11]](haystack) + + assert (needle in fb) is expected_contains + assert fb in Bytes(haystack) + + +def test_fixed_bytes_contains_with_bytes_object() -> None: + """Test FixedBytes __contains__ with Bytes object.""" + fb = FixedBytes[typing.Literal[11]](b"hello world") + + assert Bytes(b"world") in fb + assert Bytes(b"hello") in fb + assert Bytes(b"xyz") not in fb + + +def test_fixed_bytes_contains_with_fixed_bytes() -> None: + """Test FixedBytes __contains__ with another FixedBytes.""" + fb = FixedBytes[typing.Literal[11]](b"hello world") + + assert FixedBytes[typing.Literal[5]](b"world") in fb + assert FixedBytes[typing.Literal[5]](b"hello") in fb + assert FixedBytes[typing.Literal[3]](b"xyz") not in fb + + +def test_fixed_bytes_contains_edge_cases() -> None: + """Test FixedBytes __contains__ edge cases.""" + fb = FixedBytes[typing.Literal[4]](b"test") + + # Full match + assert b"test" in fb + + # Single byte + assert b"t" in fb + assert b"e" in fb + assert b"s" in fb + + # Not present + assert b"x" not in fb + assert b"testing" not in fb # longer than haystack + + +def test_augmented_assignment() -> None: + """Test that augmented assignment operators are not supported.""" + a = FixedBytes[typing.Literal[2]](b"\x0f\x0f") + b = FixedBytes[typing.Literal[2]](b"\xf0\xf0") + + a &= b + assert isinstance(a, FixedBytes) + assert a == b"\x00\x00" + + a |= b + assert isinstance(a, FixedBytes) + assert a == b"\xf0\xf0" + + a ^= b + assert isinstance(a, FixedBytes) + assert a == b"\x00\x00" + + +def test_augmented_assignment_with_bytes_object() -> None: + """Test that augmented assignment operators are not supported.""" + a = FixedBytes[typing.Literal[2]](b"\x0f\x0f") + b = Bytes(b"\xf0\xf0") + + a &= b + assert isinstance(a, FixedBytes) + assert a == b"\x00\x00" + + a |= b + assert isinstance(a, FixedBytes) + assert a == b"\xf0\xf0" + + a ^= b + assert isinstance(a, FixedBytes) + assert a == b"\x00\x00" + + +def test_augmented_assignment_different_lengths() -> None: + """Test that augmented assignment operators are not supported.""" + a = FixedBytes[typing.Literal[2]](b"\x0f\x0f") + b = b"\xf0\xf0\xf0\xf0" + + with pytest.raises(ValueError, match="expected value of length 2, not 4"): + a &= b + + with pytest.raises(ValueError, match="expected value of length 2, not 4"): + a |= b + + with pytest.raises(ValueError, match="expected value of length 2, not 4"): + a ^= b + + +def test_contains_fixed_bytes() -> None: + x: FixedBytes[typing.Literal[4]] = FixedBytes.from_hex("ABCD1234") + y: FixedBytes[typing.Literal[2]] = FixedBytes.from_bytes(Bytes.from_hex("CD12")) + assert x in x # noqa: PLR0124 + assert y in x + assert x not in y + + assert (x not in x) == False # noqa: E712, PLR0124 + assert (y not in x) == False # noqa: E712 + assert (x in y) == False # noqa: E712 + + +def test_contains_literal_bytes() -> None: + x: FixedBytes[typing.Literal[4]] = FixedBytes.from_hex("ABCD1234") + assert b"\xcd\x12" in x + + assert (b"\xcd\x12" not in x) == False # noqa: E712 diff --git a/tests/utilities/test_log.py b/tests/utilities/test_log.py index a02529bc..b08c2c21 100644 --- a/tests/utilities/test_log.py +++ b/tests/utilities/test_log.py @@ -4,7 +4,7 @@ import algopy import pytest -from _algopy_testing import AlgopyTestContext, algopy_testing_context, arc4 +from _algopy_testing import AlgopyTestContext, FixedBytes, algopy_testing_context, arc4 from _algopy_testing.constants import MAX_UINT64, MAX_UINT512 from _algopy_testing.utilities.log import log @@ -33,6 +33,7 @@ def test_log(get_avm_result: AVMInvoker, context: AlgopyTestContext) -> None: ) m = arc4.DynamicArray(arc4.UInt16(1), arc4.UInt16(2), arc4.UInt16(3)) n = arc4.Tuple((arc4.UInt32(1), arc4.UInt64(2), arc4.String("hello"))) + o = FixedBytes[typing.Literal[5]](b"hello") avm_result_ = get_avm_result( "verify_log", @@ -49,19 +50,20 @@ def test_log(get_avm_result: AVMInvoker, context: AlgopyTestContext) -> None: k=k.bytes.value, m=m.bytes.value, n=n.bytes.value, + o=o.bytes.value, ) assert isinstance(avm_result_, list) avm_result = [base64.b64decode(b) for b in avm_result_] with context.txn.create_group([context.any.txn.payment()]): # noqa: SIM117 with pytest.raises(RuntimeError, match="Can only add logs to ApplicationCallTransaction!"): - log(a, b, c, d, e, f, g, h, i, j, k, m, n, sep=b"-") + log(a, b, c, d, e, f, g, h, i, j, k, m, n, o, sep=b"-") dummy_app = context.any.application() with context.txn.create_group( [context.any.txn.application_call(app_id=dummy_app)], active_txn_index=0 ): - log(a, b, c, d, e, f, g, h, i, j, k, m, n, sep=b"-") + log(a, b, c, d, e, f, g, h, i, j, k, m, n, o, sep=b"-") last_txn = context.txn.last_active arc4_result = [last_txn.logs(i) for i in range(last_txn.num_logs)] diff --git a/tests/utilities/test_size_of.py b/tests/utilities/test_size_of.py index 36d9f6d1..0e150e27 100644 --- a/tests/utilities/test_size_of.py +++ b/tests/utilities/test_size_of.py @@ -8,6 +8,7 @@ Asset, Bytes, FixedArray, + FixedBytes, ImmutableArray, ImmutableFixedArray, String, @@ -32,6 +33,7 @@ class Swapped(Struct): c: tuple[UInt64, bool, bool] d: FixedArray[bool, typing.Literal[10]] e: tuple[UInt64, ImmutableFixedArray[UInt64, typing.Literal[3]]] + f: FixedBytes[typing.Literal[5]] class WhatsMySize(typing.NamedTuple): @@ -69,8 +71,8 @@ def test_size_of() -> None: assert size_of(arc4.Tuple[arc4.UInt64, arc4.Bool, arc4.Bool] == 9) assert size_of(MyTuple) == 9 assert size_of(SwappedArc4) == 52 - assert size_of(Swapped) == 52 - assert size_of(WhatsMySize) == 113 + assert size_of(Swapped) == 57 + assert size_of(WhatsMySize) == 118 assert size_of(arc4.StaticArray[arc4.Byte, typing.Literal[7]]) == 7 assert size_of(arc4.StaticArray(arc4.Byte(), arc4.Byte())) == 2 assert size_of(FixedArray[bool, typing.Literal[10]]) == 2 diff --git a/tests/value_generators/test_avm.py b/tests/value_generators/test_avm.py index ca7cf1b9..fabd3e47 100644 --- a/tests/value_generators/test_avm.py +++ b/tests/value_generators/test_avm.py @@ -1,3 +1,4 @@ +import typing from collections.abc import Iterator import algopy @@ -7,7 +8,9 @@ from _algopy_testing.constants import MAX_BYTES_SIZE, MAX_UINT64 from _algopy_testing.context import AlgopyTestContext from _algopy_testing.primitives.bytes import Bytes +from _algopy_testing.primitives.fixed_bytes import FixedBytes from _algopy_testing.primitives.string import String +from _algopy_testing.utils import get_type_generic_from_int_literal @pytest.fixture() @@ -20,8 +23,10 @@ def assert_value_in_range(value: int | object, min_val: int, max_val: int) -> No assert min_val <= value <= max_val # type: ignore[operator] -def assert_length(value: bytes | str | String | Bytes, expected_length: int) -> None: - if isinstance(value, bytes | Bytes): +def assert_length( + value: bytes | str | String | Bytes | FixedBytes[typing.Any], expected_length: int +) -> None: + if isinstance(value, bytes | Bytes | FixedBytes): assert len(value) == expected_length else: assert len(str(value)) == expected_length @@ -60,6 +65,14 @@ def test_avm_bytes_generator(context: AlgopyTestContext, length: int | None) -> assert_length(value, length or MAX_BYTES_SIZE) +@pytest.mark.parametrize("length", [0, 10, MAX_BYTES_SIZE]) +def test_avm_fixed_bytes_generator(context: AlgopyTestContext, length: int) -> None: + length_t = get_type_generic_from_int_literal(length) + value = context.any.fixed_bytes(FixedBytes[length_t]) # type: ignore[valid-type] + assert isinstance(value, algopy.FixedBytes) + assert_length(value, length) + + @pytest.mark.parametrize("length", [None, 10, MAX_BYTES_SIZE]) def test_avm_string_generator(context: AlgopyTestContext, length: int | None) -> None: value = context.any.string(length) if length else context.any.string() From 9d5d690691f71737d9fa867cb0091aa073c73a45 Mon Sep 17 00:00:00 2001 From: Bobby Lat Date: Tue, 25 Nov 2025 16:50:53 +0800 Subject: [PATCH 3/4] refactor: review feedback --- src/_algopy_testing/primitives/fixed_bytes.py | 73 +++++++++++-------- tests/models/test_box.py | 16 +++- tests/primitives/test_fixed_bytes.py | 18 ++++- 3 files changed, 74 insertions(+), 33 deletions(-) diff --git a/src/_algopy_testing/primitives/fixed_bytes.py b/src/_algopy_testing/primitives/fixed_bytes.py index b0a63a97..83c68035 100644 --- a/src/_algopy_testing/primitives/fixed_bytes.py +++ b/src/_algopy_testing/primitives/fixed_bytes.py @@ -6,7 +6,7 @@ import typing if typing.TYPE_CHECKING: - from collections.abc import Iterator + from collections.abc import Callable, Iterator from itertools import zip_longest @@ -24,18 +24,19 @@ _TBytesLength_Arg = typing.TypeVar("_TBytesLength_Arg", bound=int) -def _create_class_from_type(cls: type, length_t: type) -> type: +def _get_or_create_class_from_type(cls: type, length_t: type) -> type: _length = get_int_literal_from_type_generic(length_t) - return _create_class(cls, _length, length_t) + return _get_or_create_class(cls, _length, length_t) -def _create_class_from_int(cls: type, length: int) -> type: +def _get_or_create_class_from_int(cls: type, length: int) -> type: length_t = get_type_generic_from_int_literal(length) - return _create_class(cls, length, length_t) + return _get_or_create_class(cls, length, length_t) -def _create_class(cls: type, length: int, length_t: type) -> type: - cache = cls.__concrete__ if hasattr(cls, "__concrete__") else {} +def _get_or_create_class(cls: type, length: int, length_t: type) -> type: + """Get or create a type that is parametrized with element_t and length.""" + cache = getattr(cls, "__concrete__", {}) if c := cache.get(length_t, None): assert isinstance(c, type) return c @@ -55,12 +56,11 @@ def _create_class(cls: type, length: int, length_t: type) -> type: class _FixedBytesMeta(type): __concrete__: typing.ClassVar[dict[type, type]] = {} - # get or create a type that is parametrized with element_t and length def __getitem__(cls, length_t: type) -> type: if length_t == typing.Any: return cls - return _create_class_from_type(cls, length_t) + return _get_or_create_class_from_type(cls, length_t) class FixedBytes( @@ -103,8 +103,6 @@ def __bool__(self) -> bool: def __len__(self) -> int: return self._length - # mypy suggests due to Liskov below should be other: object - # need to consider ramifications here, ignoring it for now def __eq__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool: # type: ignore[override] """FixedBytes can be compared using the `==` operator with another FixedBytes, Bytes or bytes.""" @@ -134,17 +132,18 @@ def __radd__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> Byte result = as_bytes(other) + self.value return _checked_result(result, "+") + def __iadd__(self, _other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc] + raise TypeError("FixedBytes does not support in-place addition") + @property def length(self) -> UInt64: """Returns the specified length of the FixedBytes.""" return UInt64(self._length) - def __getitem__( - self, index: UInt64 | int | slice - ) -> Bytes: # maps to substring/substring3 if slice, extract/extract3 otherwise? + def __getitem__(self, index: UInt64 | int | slice) -> Bytes: """Returns a Bytes containing a single byte if indexed with UInt64 or int otherwise the substring of bytes described by the slice.""" - value = self.value[None : self.length] + value = self.value[: self.length] if isinstance(index, slice): return Bytes(value[index]) else: @@ -174,7 +173,7 @@ def __and__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typin Returns FixedBytes if other has the same length, otherwise returns Bytes. """ - return self._operate_bitwise(other, "and_") + return self._operate_bitwise(other, operator.and_) def __rand__(self, other: bytes) -> Bytes: return self & other @@ -182,7 +181,7 @@ def __rand__(self, other: bytes) -> Bytes: def __iand__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc] other_bytes = as_bytes(other) other_fixed_bytes = self.__class__(other_bytes) - result = self._operate_bitwise(other_fixed_bytes, "and_") + result = self._operate_bitwise(other_fixed_bytes, operator.and_) assert isinstance(result, self.__class__) return result @@ -191,7 +190,7 @@ def __or__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overloa @typing.overload def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ... def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes: - return self._operate_bitwise(other, "or_") + return self._operate_bitwise(other, operator.or_) def __ror__(self, other: bytes) -> Bytes: return self | other @@ -199,7 +198,7 @@ def __ror__(self, other: bytes) -> Bytes: def __ior__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc] other_bytes = as_bytes(other) other_fixed_bytes = self.__class__(other_bytes) - result = self._operate_bitwise(other_fixed_bytes, "or_") + result = self._operate_bitwise(other_fixed_bytes, operator.or_) assert isinstance(result, self.__class__) return result @@ -208,7 +207,7 @@ def __xor__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overlo @typing.overload def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ... def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes: - return self._operate_bitwise(other, "xor") + return self._operate_bitwise(other, operator.xor) def __rxor__(self, other: bytes) -> Bytes: return self ^ other @@ -216,7 +215,7 @@ def __rxor__(self, other: bytes) -> Bytes: def __ixor__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc] other_bytes = as_bytes(other) other_fixed_bytes = self.__class__(other_bytes) - result = self._operate_bitwise(other_fixed_bytes, "xor") + result = self._operate_bitwise(other_fixed_bytes, operator.xor) assert isinstance(result, self.__class__) return result @@ -231,9 +230,8 @@ def __invert__(self) -> typing.Self: def _operate_bitwise( self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes, - operator_name: str, + op: Callable[[int, int], int], ) -> typing.Self | Bytes: - op = getattr(operator, operator_name) maybe_bytes = as_bytes(other) # pad the shorter of self.value and other bytes with leading zero # by reversing them as zip_longest fills at the end @@ -259,33 +257,46 @@ def from_base32(cls, value: str) -> typing.Self: """Creates FixedBytes from a base32 encoded string e.g. `FixedBytes.from_base32("74======")`""" bytes_value = base64.b32decode(value) - c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls - return c(bytes_value) # type: ignore[no-any-return] + c = cls._ensure_class_with_length(bytes_value) + return c(bytes_value) @classmethod def from_base64(cls, value: str) -> typing.Self: """Creates FixedBytes from a base64 encoded string e.g. `FixedBytes.from_base64("RkY=")`""" bytes_value = base64.b64decode(value) - c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls - return c(bytes_value) # type: ignore[no-any-return] + c = cls._ensure_class_with_length(bytes_value) + return c(bytes_value) @classmethod def from_hex(cls, value: str) -> typing.Self: """Creates FixedBytes from a hex/octal encoded string e.g. `FixedBytes.from_hex("FF")`""" bytes_value = base64.b16decode(value) - c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls - return c(bytes_value) # type: ignore[no-any-return] + c = cls._ensure_class_with_length(bytes_value) + return c(bytes_value) @classmethod def from_bytes(cls, value: Bytes | bytes) -> typing.Self: """Construct an instance from the underlying bytes (no validation)""" bytes_value = as_bytes(value) - c = _create_class_from_int(cls, len(bytes_value)) if not hasattr(cls, "_length") else cls + c = cls._ensure_class_with_length(bytes_value) result = c() result.value = bytes_value - return result # type: ignore[no-any-return] + return result + + @classmethod + def _ensure_class_with_length(cls, bytes_value: bytes) -> type[typing.Self]: + """Returns the appropriate class for the given bytes value. + + If cls has a fixed _length, returns cls. Otherwise, returns or creates a + specialized class with the length set to match bytes_value. + """ + return ( + _get_or_create_class_from_int(cls, len(bytes_value)) + if not hasattr(cls, "_length") + else cls + ) @property def bytes(self) -> Bytes: diff --git a/tests/models/test_box.py b/tests/models/test_box.py index 0b1a34fc..eee5beed 100644 --- a/tests/models/test_box.py +++ b/tests/models/test_box.py @@ -20,6 +20,7 @@ ) from _algopy_testing.primitives.biguint import BigUInt from _algopy_testing.primitives.bytes import Bytes +from _algopy_testing.primitives.fixed_bytes import FixedBytes from _algopy_testing.primitives.string import String from _algopy_testing.primitives.uint64 import UInt64 from _algopy_testing.state.box import Box @@ -387,7 +388,7 @@ class Swapped2(Struct): b: Array[UInt64] -def test_arrays_and_struct_in_boxes(context: AlgopyTestContext) -> None: # noqa: ARG001 +def test_arrays_and_struct_in_boxes(context: AlgopyTestContext) -> None: # noqa: ARG001, PLR0915 # Array arr1 = Array([UInt64(1), UInt64(2), UInt64(3)]) arr2 = Array([UInt64(4), UInt64(5), UInt64(6)]) @@ -460,6 +461,19 @@ def test_arrays_and_struct_in_boxes(context: AlgopyTestContext) -> None: # noqa box5.value.a[1] = UInt64(20) assert list(box5.value.a) == [UInt64(1), UInt64(20), UInt64(3)] + # FixedBytes in FixedArray + box6 = Box( + FixedArray[FixedBytes[typing.Literal[1024]], typing.Literal[10]], key=b"test_array_6" + ) + box6.value = FixedArray( + [FixedBytes[typing.Literal[1024]].from_hex(f"0{x}" * 1024) for x in range(10)] + ) + assert box6.length == 10 * 1024 + assert box6.value[0].bytes == b"\x00" * 1024 + assert box6.value[9].bytes == b"\x09" * 1024 + box6.value[1] = FixedBytes[typing.Literal[1024]].from_hex("11" * 1024) + assert box6.value[1].bytes == b"\x11" * 1024 + def test_box() -> None: with algopy_testing_context(): diff --git a/tests/primitives/test_fixed_bytes.py b/tests/primitives/test_fixed_bytes.py index a59adcbb..9a0c673f 100644 --- a/tests/primitives/test_fixed_bytes.py +++ b/tests/primitives/test_fixed_bytes.py @@ -54,7 +54,8 @@ def test_fixed_bytes_init_wrong_length(value: bytes | Bytes, message: str) -> No ) def test_fixed_bytes_bool( value: FixedBytes, # type: ignore[type-arg] - expected: bool, # noqa: FBT001 + *, + expected: bool, ) -> None: assert bool(value) == expected @@ -596,6 +597,21 @@ def test_fixed_bytes_contains_edge_cases() -> None: assert b"testing" not in fb # longer than haystack +def test_in_place_addition() -> None: + """Test that in-place addition is not supported.""" + a = FixedBytes[typing.Literal[4]](b"test") + b = FixedBytes[typing.Literal[4]](b"data") + + with pytest.raises(TypeError, match="FixedBytes does not support in-place addition"): + a += b + + with pytest.raises(TypeError, match="FixedBytes does not support in-place addition"): + a += b"hello" + + with pytest.raises(TypeError, match="FixedBytes does not support in-place addition"): + a += Bytes(b"hello") + + def test_augmented_assignment() -> None: """Test that augmented assignment operators are not supported.""" a = FixedBytes[typing.Literal[2]](b"\x0f\x0f") From 988608319dcda8cac42a7f44511f2f270d38bb6c Mon Sep 17 00:00:00 2001 From: Bobby Lat Date: Mon, 1 Dec 2025 14:06:43 +0800 Subject: [PATCH 4/4] test: add test to ensure FixBytes > 4k can be stored in a Box --- src/_algopy_testing/primitives/fixed_bytes.py | 2 +- src/_algopy_testing/state/utils.py | 7 ++----- tests/primitives/test_fixed_bytes.py | 19 ++++++++++++++++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/_algopy_testing/primitives/fixed_bytes.py b/src/_algopy_testing/primitives/fixed_bytes.py index 83c68035..ecde74e2 100644 --- a/src/_algopy_testing/primitives/fixed_bytes.py +++ b/src/_algopy_testing/primitives/fixed_bytes.py @@ -279,7 +279,7 @@ def from_hex(cls, value: str) -> typing.Self: @classmethod def from_bytes(cls, value: Bytes | bytes) -> typing.Self: """Construct an instance from the underlying bytes (no validation)""" - bytes_value = as_bytes(value) + bytes_value = value.value if isinstance(value, Bytes) else value c = cls._ensure_class_with_length(bytes_value) result = c() result.value = bytes_value diff --git a/src/_algopy_testing/state/utils.py b/src/_algopy_testing/state/utils.py index 34f6218b..cae50224 100644 --- a/src/_algopy_testing/state/utils.py +++ b/src/_algopy_testing/state/utils.py @@ -42,11 +42,7 @@ def deserialize(typ: type[_TValue], value: SerializableValue) -> _TValue: if isinstance(value, bytes): raise TypeError("expected int, received bytes") return typ.from_int(value) # type: ignore[return-value] - elif issubclass(typ, BytesBacked): - if isinstance(value, int): - raise TypeError("expected bytes, received int") - return typ.from_bytes(Bytes(value)) # type: ignore[return-value] - elif issubclass(typ, Serializable): + elif issubclass(typ, BytesBacked | Serializable): if isinstance(value, int): raise TypeError("expected bytes, received int") return typ.from_bytes(value) # type: ignore[return-value] @@ -70,6 +66,7 @@ def cast_from_bytes(typ: type[_TValue], value: bytes) -> _TValue: serialized = as_int64(serialized) else: serialized = value + return deserialize(typ, serialized) diff --git a/tests/primitives/test_fixed_bytes.py b/tests/primitives/test_fixed_bytes.py index 9a0c673f..643abd59 100644 --- a/tests/primitives/test_fixed_bytes.py +++ b/tests/primitives/test_fixed_bytes.py @@ -2,10 +2,12 @@ import typing import pytest +from _algopy_testing import algopy_testing_context from _algopy_testing.constants import MAX_BYTES_SIZE from _algopy_testing.primitives.bytes import Bytes from _algopy_testing.primitives.fixed_bytes import FixedBytes from _algopy_testing.primitives.uint64 import UInt64 +from _algopy_testing.state.box import Box from tests.util import int_to_bytes @@ -231,9 +233,6 @@ def test_fixed_bytes_from_bytes() -> None: assert len(fb32) == 32 assert fb32.length == 32 - with pytest.raises(ValueError, match="expected value length <= 4096, got: 4097"): - FixedBytes[typing.Literal[64]].from_bytes(b"\x0f" * 4097) - def test_fixed_bytes_from_bytes_with_bytes_object() -> None: """Test FixedBytes.from_bytes class method with Bytes object.""" @@ -680,3 +679,17 @@ def test_contains_literal_bytes() -> None: assert b"\xcd\x12" in x assert (b"\xcd\x12" not in x) == False # noqa: E712 + + +def test_big_fixed_bytes_in_box() -> None: + with algopy_testing_context() as ctx: # noqa: SIM117 + with ctx.txn.create_group([ctx.any.txn.application_call()]): + big_box = Box(FixedBytes[typing.Literal[5000]], key=b"big") + big_box.create() + assert big_box.value[4999] == b"\x00" + + big_box.replace(4999, b"\xff") + assert big_box.value[4999] == b"\xff" + + big_box.splice(4990, 10, b"\x7f" * 10) + assert big_box.value[4990:] == b"\x7f" * 10